归并排序
2015-09-11 11:31
225 查看
1、算法基本思路
设两个有序的子文件(相当于输入堆)放在同一向量中相邻的位置上:R[low..m],R[m+1..high],先将它们合并到一个局部的暂存向量R1(相当于输出堆)中,待合并完成后将R1复制回R[low..high]中。
合并过程:
合并过程中,设置i,j和p三个指针,其初值分别指向这三个记录区的起始位置。
合并时依次比较R[i]和R[j]的关键字,取关键字较小的记录复制到R1[p]中,然后将被复制记录的指针i或j加1,以及指向复制位置的指针p加1。
重复这一过程直至两个输入的子文件有一个已全部复制完毕(不妨称其为空),此时将另一非空的子文件中剩余记录依次复制到R1中即可。
归并排序算法如下:
设两个有序的子文件(相当于输入堆)放在同一向量中相邻的位置上:R[low..m],R[m+1..high],先将它们合并到一个局部的暂存向量R1(相当于输出堆)中,待合并完成后将R1复制回R[low..high]中。
合并过程:
合并过程中,设置i,j和p三个指针,其初值分别指向这三个记录区的起始位置。
合并时依次比较R[i]和R[j]的关键字,取关键字较小的记录复制到R1[p]中,然后将被复制记录的指针i或j加1,以及指向复制位置的指针p加1。
重复这一过程直至两个输入的子文件有一个已全部复制完毕(不妨称其为空),此时将另一非空的子文件中剩余记录依次复制到R1中即可。
归并排序算法如下:
#include<iostream> using namespace std; template<class T> void Merge(T a[], int low, int mid, int high) { int i = low; int j = mid + 1; int k = 0; int *TR = new int[high - low + 1]; while (i <= mid && j <= high) { if (a[i] < a[j]) TR[k++] = a[i++]; else TR[k++] = a[j++]; } while (i<=mid) TR[k++] = a[i++]; while (j <= high) TR[k++] = a[j++]; for (int v = 0, i = low; i <= high; ++i, ++v) a[i] = TR[v]; delete [] TR; } template<class T> void MSort(T a[], int low, int high) { int mid; if (low < high) { mid = (low + high) / 2; MSort(a, low, mid); MSort(a, mid + 1, high); Merge(a, low, mid, high); } } template<class T> void MergeSort(T a[], int n) { MSort(a, 0, n-1); } int main() { int a[100]; int n; cout << "请输入数字个数:"; cin >> n; for (int i = 0; i < n; ++i) cin >> a[i]; MergeSort(a, n); cout << "排序后:"; for (int i = 0; i < n; ++i) cout << a[i] << " "; cout << endl; return 0; }
相关文章推荐
- C++实现八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序等
- Java实现八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序等
- Java排序算法总结之归并排序
- C++归并排序算法实例
- Javascript排序算法之合并排序(归并排序)的2个例子
- 归并排序的递归实现与非递归实现代码
- java二路归并排序示例分享
- java实现归并排序算法
- 归并排序的实现代码与思路
- leetcode 虐我篇之(二) Two Sum
- In-place Merge Sort 原地并归排序
- 使用Java完成《算法导论》习题2.3-2
- 插入排序移动次数
- 归并排序 with Python
- 归并排序-逆序对的求解
- 排序算法的复杂度和稳定性
- 用python实现归并排序
- (转)排序算法的稳定与不稳定
- 自学笔记之归并排序
- java实现排序算法