归并排序的实现

2024-03-28

我是 C++ 新手,正在尝试开发合并排序的代码。我用大小为 5 的样本数组对其进行了测试,但代码给出的答案不正确。我不明白出了什么问题。这是我的代码:

#include <iostream>
#include <cstring>
#include <sstream>
#include <fstream>
#include <iomanip>
using namespace std;
void merge(int, int, int, int*);
void merge_sort(int low, int high, int* p){
    int pivot;
    static int i(1);
    if (high>low)
    {
        cout << "calling merge_sort: "<<i<<endl; i++;
        pivot = low + ((high - low)/2);
        cout << pivot << endl;
        merge_sort(low, pivot, p);
        merge_sort(pivot+1, high, p);
        merge(low, pivot, high, p);

    }
}
void merge(int l, int pi, int h,int* arr)
{
            int start = l;
        int mid = pi+1;
        while((start<=pi)&&(mid <=h)){
            if (arr[start] > arr[mid])
            {
                int temp = arr[mid];
                arr[mid] = arr[start];
                arr[start] = temp;
                mid++;
             }
            else
                start++;
    }
}
int main() 
{
    int a[] = {2, 42, 3, 7, 1};
    merge_sort(0, 4, a);
    for (int i = 0; i<=4 ; i++)
        cout << a[i] << endl;
    return (0);

}

输出如下:

calling merge_sort: 1
2
calling merge_sort: 2
1
calling merge_sort: 3
0
calling merge_sort: 4
3
1
3
7
2
42

我在 stackoverflow 上看到了一些合并排序实现的代码,但它们使用了另一个临时数组,我想避免这种情况。

非常感谢您在解决此问题时提供任何帮助。


你的合并逻辑是错误的。在合并阶段,您知道您有 2 部分已排序的数字。当你比较和交换时arr[start] and arr[mid]如果出现以下情况,您将破坏顶部数字集的排序arr[start] > arr[mid+1]。该示例显示您的代码存在问题,因为 2 将留在错误的位置:

4 6 8 | 1 3 5  ->  1 6 8 | 4 3 5
^       ^          ^         ^

为了保持 2 个部分的排序,您必须插入arr[start]在顶部数字集中的正确位置,这会使复杂性比O(n lg n)。这就是使用第二个数组的原因。

有些方法使用比原始数组更小的数组进行合并,这些方法有其开销,但不会影响复杂性(或正确性)。如果你想要一个O(n lg n)就地排序然后快速排序或堆排序是可行的方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

归并排序的实现 的相关文章

  • 用 C 语言制作查找表的最佳方法是什么?

    我正在开发一个嵌入式 C 项目 我有一个 LCD 显示屏 每个字符都有一个 5x7 点阵 要显示特定字符 您必须移动与要打开的点相关的 5 个字节 所以我需要制作某种带有键的查找表 我可以在其中传递 ASCII 字符 并返回一个 5 字节的
  • pthread_create 编译返回错误

    我使用以下代码创建两个线程 header files include
  • nUnit Assert.That(method,Throws.Exception) 不捕获异常

    有人可以告诉我为什么这个检查异常的单元测试失败了 显然我真正的测试是检查其他代码 但我使用 Int32 Parse 来显示问题 Test public void MyTest Assert That Int32 Parse abc Thro
  • Xamarin 中的 Task.ConfigureAwait(false) - 安全使用/建议使用?

    经验法则是 如果它不是与 UI 相关的方法 请使用Task ConfigureAwait false 如果我有一个接受接口的 PCL 核心库怎么办IUIAccess 核心库中的视图模型有一个方法 public Task ViewModelL
  • 初始化影子变量

    标准中是否有任何内容定义从它隐藏的变量初始化变量 例如 int i 7 int i i Visual Studio 2013 允许这样做而不发出警告并按预期工作 内在i变量是 7 然而 Clang 和 GCC 给我一个警告 关于从自身初始化
  • 在 Windows 上实现堆栈跟踪 [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我正在为我正在编写的游戏实现一个崩溃报告工具 并且我想为该报告提供 相当 详细的本机堆栈跟踪 我已经在 GNU Linux 上实现
  • 阅读 C 语言中的科学记数法

    我正在尝试读取包含以下内容的文件 1 0000000e 01 2 9265380e 03 5 0821200e 02 4 3231640e 01 2 0000000e 01 1 0170240e 04 9 2798610e 02 4 072
  • 从 C 调用带有字符串参数的 Go 函数?

    我可以从 C 调用一个没有参数的 Go 函数 按照下面的 https github com joeprivacy crefgo hello world 这通过编译go build和打印 Hello from Golang main func
  • 使用 JsonWriter 时,WriteStartConstructor 的用途是什么?

    标题说明了一切 我看到它 及其相应的结尾 吐出以下内容 new Foo 但我不明白什么new实际上是在反序列化时执行的 文档只是说它编写了一个 Json 构造函数 但没有说 Json 构造函数是什么is 此方法是作为增强功能的一部分引入的
  • C++ 中“return *this”是什么意思?

    我正在将 C 程序转换为 C 但这部分让我感到困惑 return this 是什么意思 template lt EDemoCommands msgType typename PB OBJECT TYPE gt class CDemoMess
  • 移动数组中的元素

    我需要一点帮助 我想将数组中的元素向上移动一个元素 以便新位置 1 包含位置 1 中的旧值 new 2 包含 old 1 依此类推 旧的最后一个值被丢弃 第一个位置的新值是我每秒给出的新值 我使用大小为 10 的数组 uint32 t TE
  • File.Delete 进程无法访问该文件,因为该文件正在被另一个进程使用

    public bool DownloadMp3File DownloadedMp3 mp3 WebClient client new WebClient string filePath bool wasDownload false try
  • 如何从 .NET DataGridView 控件单元格值写入文本文件?

    我有以下代码应该循环遍历我的所有行DataGridView 并将其所有单元格值写入文本文件 但是 它输出所有行 但仅输出每行的第一个单元格 而不输出其他三个单元格 string file name C test1 txt var objWr
  • 何时使用 const char * 何时使用 const char[]

    我知道它们是不同的 我知道它们有何不同 并且我阅读了我能找到的所有关于char vs char 但所有这些答案都没有告诉我们什么时候应该使用它们 所以我的问题是 你什么时候使用 const char text text 你什么时候使用 co
  • MDI 窗体中的子窗口对接

    我有一个 MDI 表单和其中的一些子表单 我将子窗体停靠到 MDI 窗口的不同区域 但是当任何子窗体失去焦点时 其他停靠的窗体将重新排列 由于混乱 我准备了一组图像来展示该行为 Image1 单击任何窗口之前 Image2 点击窗口2后 问
  • 将 tiff 像素长宽比更改为正方形

    我正在尝试对多页 tiff 文件执行条形码识别 但是 tiff 文件是从传真服务器 我无法控制 发送给我的 该服务器以非方形像素长宽比保存 tiff 这导致图像由于纵横比而被严重挤压 我需要将 tiff 转换为方形像素长宽比 但不知道如何在
  • 缓存行对齐(需要文章澄清)

    我最近在我的应用程序中遇到了我认为是错误共享的问题 我查了一下关于如何将我的数据与缓存行对齐 他建议使用以下 C 代码 C using C 0x alignment syntax template
  • 在 Blazor 中显示计时器

    我正在尝试在服务器端 Blazor 应用程序中显示倒计时器 我的代码同时使用 F 和 C 语言 该代码在某种程度上可以工作 但计时器永远不会按预期停止 并且计时器显示偶尔不会呈现所有数字 这是我第一次尝试 Blazor 服务器端应用程序 我
  • Security.h 中结构的 macOS 文档

    我正在尝试使用Security h通过 Java 和 JNA 的 macOS 框架 这意味着我需要将某些结构重建为 Java 类 问题是 当我查看文档中的结构时 this one https developer apple com refe
  • C++ 模板类问题中的类型条件

    使用海湾合作委员会4 2 我有这个条件类型的元模板 template

随机推荐

  • React Native - 通过邮件发送照片

    我正在尝试通过邮件发送最近在应用程序中捕获的照片 但遇到以下错误 对于邮件功能 我正在使用此模块 var Mailer require NativeModules RNMail 我试图借助此模块通过邮件发送照片 但出现以下错误 index
  • 如何使用界面生成器更改 ipad 的文本字段高度?

    我们正在使用 Interface Builder 开发 iPad 应用程序 但我们不知道如何增加文本字段的高度 当我们使用 IB 为 osx 开发应用程序时 您可以转到文本字段属性 并在控制部分下将换行符设置为自动换行而不是剪辑 但是 当我
  • MultiColumnText 在 iTextSharp v5.3.3 中工作吗?

    我找不到MultiColumnTextiTextSharp v5 3 3 来自 NuGet 中的任何位置 我能找到的就是ColumnText这当然使用起来不太友好 而且超出了我真正需要的范围 我错过了什么吗 有几个链接说MultiColum
  • 使用 pymc 与 MCMC 拟合两个正态分布(直方图)?

    我正在尝试拟合 CCD 上摄谱仪检测到的线轮廓 为了便于考虑 我提供了一个演示 如果解决了 它与我的演示非常相似actually想要解决 我看过这个 https stats stackexchange com questions 46626
  • TStringList 的 addObject 方法

    我想知道这个方法调用的作用 stringList addObject String Object 我也想知道这个属性是做什么的 stringList Objects i 添加时看起来像键 值对 但是在循环检索时检索到了什么 我还看到 ite
  • Tensorflow将LSTM的最终状态保存在dynamic_rnn中用于预测

    我想保存 LSTM 的最终状态 以便在恢复模型时将其包含在内并可用于预测 如下所述 当我使用时 保护程序仅了解最终状态tf assign 但是 这会引发错误 也将在下面解释 在训练期间 我总是将最终的 LSTM 状态反馈回网络 如中所述这个
  • Spring集成测试时如何mock Eureka?

    我正在 Spring Boot 中运行一个简单的 Junit 测试控制器 测试代码如下所示 RunWith SpringJUnit4ClassRunner class SpringApplicationConfiguration class
  • setEndTime 必须在 setStartTime 之后调用

    尝试使用 JMeter JMS Publisher 推送消息 但低于错误 这是jmeter端错误还是服务器端错误 Error setEndTime must be called after setStartTime java lang Th
  • 使用 Google App Engine 时需要解决哪些安全问题?

    我一直在考虑将 Google App Engine 用于一些业余爱好项目 虽然他们不会处理任何敏感数据 但出于多种原因 我仍然希望使它们相对安全 例如了解安全性 法律等 使用 Google App Engine 时需要解决哪些安全问题 它们
  • 手动修改参考类实例的类定义

    我知道这将是一个非常不可靠的黑客行为 但出于纯粹的兴趣 您需要手动更改什么 refClassDef如果已实例化的对象的引用类定义发生更改 并且您希望它 收到有关更新的通知 而不重新实例化它 则引用类对象的字段 毕竟 如果额外的方法被引入 但
  • 如何抑制有关 Sun 专有 API 的 java 编译器警告 [重复]

    这个问题在这里已经有答案了 我正在使用 sun misc BASE64Encoder 包中的encode 方法 如何抑制它生成的编译器警告 sun misc BASE64Encoder 是 Sun 专有 API 可能会在 作为后续 为什么我
  • 数组/数据存储选项

    我是 Android 新手 正在尝试开发我的第一个应用程序 在我的应用程序中 我有一个列出一组商店的列表视图活动 当应用程序用户 下载该应用程序的任何人 选择他们最喜欢的商店时 应将 1 添加到该商店计数中 在一年中的特定时间 我想按商店数
  • 当我使用computeIfAbsent计算斐波那契数时,hashmap size()返回错误的值

    我有以下代码 import java math BigInteger import java util HashMap import java util Map public class DynamicFib private static
  • 错误消息“运算符 '.'将方法转换为扩展方法时,无法应用于“lambda 表达式”类型的操作数?

    我有一个方法想要转换为扩展方法 public static string GetMemberName
  • String.replaceAll 比自己完成这项工作要慢得多

    我有一段旧代码 可以在字符串中执行查找和替换标记 它收到一张地图from and to对 迭代它们 对于每个对 迭代目标字符串 查找from using indexOf 并将其替换为to 它完成了所有工作StringBuffer最终返回一个
  • QueryDSL 条件排序依据

    我想翻译原生sql 例如 ORDER BY currency EUR DESC money DESC 进入查询DSL orderBy qItem currency eq EUR desc qItem money desc 然而它抛出 org
  • CMake - 安装第三方 dll 依赖项

    我正在使用一个预编译的第三方库 它有多个 DLL 一个用于实际的第三方 还有一些作为其自己的依赖项 我的目录结构如下 MyApp CMakeLists txt Root CMake file src MyCode cpp thirdpart
  • 如何在两个 WiX 项目中共享 WiX 片段?

    我们在 SomeDialog wxs 文件中有一个 WiX 片段 它提示用户输入一些信息 它在控制对话框顺序的 InstallerUI wxs 文件中的另一个片段中引用 当然 Product wxs是我们的主文件 效果很好 现在 我有第二个
  • 如何获取具有相同键值并以逗号分隔的对象

    我有一个对象数组 每个对象都有键和值 我希望如果对象具有相同的键 那么它们的值应该以逗号分隔相同键的所有值 我的html代码 p class item item id p
  • 归并排序的实现

    我是 C 新手 正在尝试开发合并排序的代码 我用大小为 5 的样本数组对其进行了测试 但代码给出的答案不正确 我不明白出了什么问题 这是我的代码 include