合并排序算法-c++

参考来源:http://www.cnblogs.com/yangecnu/p/Introduce-Merge-Sort.html
合并排序,顾名思义,就是通过将两个有序的序列合并为一个大的有序的序列的方式来实现排序。合并排序是一种典型的分治算法:首先将序列分为两部分,然后对每一部分进行循环递归的排序,然后逐个将结果进行合并。
这里写图片描述
合并排序最大的优点是它的时间复杂度为O(nlgn),这个是我们之前的选择排序和插入排序所达不到的。他还是一种稳定性排序,也就是相等的元素在序列中的相对位置在排序前后不会发生变化。他的唯一缺点是,需要利用额外的N的空间来进行排序。

合并算法:
合并排序依赖于合并操作,即将两个已经排序的序列合并成一个序列,具体的过程如下:
1、申请空间,使其大小为两个已经排序序列之和,然后将待排序数组复制到该数组中。
2、设定两个指针,最初位置分别为两个已经排序序列的起始位置
3、比较复制数组中两个指针所指向的元素,选择相对小的元素放入到原始待排序数组中,并移动指针到下一位置
4、重复步骤3直到某一指针达到序列尾
5、将另一序列剩下的所有元素直接复制到原始数组末尾
实现代码:

private sta
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的C++代码实现,用于合并排序两个已排序的数组。这是一个递归算法,将数组分成两部分,对每个部分进行排序,之后将它们合并在一起: ```c++ #include <iostream> #include <vector> using namespace std; // 合并两个已排序的子数组 void merge(vector<int>& nums, int left, int mid, int right) { vector<int> temp(right - left + 1); int i = left, j = mid + 1, k = 0; while (i <= mid && j <= right) { if (nums[i] <= nums[j]) { temp[k++] = nums[i++]; } else { temp[k++] = nums[j++]; } } while (i <= mid) { temp[k++] = nums[i++]; } while (j <= right) { temp[k++] = nums[j++]; } for (int p = 0; p < k; ++p) { nums[left + p] = temp[p]; } } // 合并排序函数 void merge_sort(vector<int>& nums, int left, int right) { if (left >= right) return; int mid = (left + right) / 2; merge_sort(nums, left, mid); merge_sort(nums, mid + 1, right); merge(nums, left, mid, right); } int main() { vector<int> nums = {3, 5, 1, 7, 2, 9, 4, 6}; merge_sort(nums, 0, nums.size() - 1); for (int num : nums) { cout << num << " "; } return 0; } ``` 这里使用了一个辅助函数 `merge()`,它用于合并两个已排序的子数组。主要思路是创建一个临时数组,将两个子数组中的元素按顺序插入到这个数组中,然后将临时数组中的元素复制回原数组中。 合并排序函数 `merge_sort()` 是递归的,它将数组分成两个部分,对每个部分分别进行排序,然后将它们合并在一起。当数组的大小为1时,排序完成。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值