排序——归并排序
2016-08-23 15:57
288 查看
归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。
归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。
如 设有数列{6,202,100,301,38,8,1}
初始状态: [6] [202] [100] [301] [38] [8] [1] 比较次数
i=1 [6 202 ] [ 100 301] [ 8 38] [ 1 ] 3
i=2 [ 6 100 202 301 ] [ 1 8 38 ] 4
i=3 [ 1 6 8 38 100 202 301 ] 4
总计: 11次
实现的代码如下:
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。
归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。
如 设有数列{6,202,100,301,38,8,1}
初始状态: [6] [202] [100] [301] [38] [8] [1] 比较次数
i=1 [6 202 ] [ 100 301] [ 8 38] [ 1 ] 3
i=2 [ 6 100 202 301 ] [ 1 8 38 ] 4
i=3 [ 1 6 8 38 100 202 301 ] 4
总计: 11次
实现的代码如下:
1 #include <iostream> 2 using namespace std; 3 4 //将2个有序数组a[first...mid]和a[mid+1...last]数组和合并 5 void mergearray(int a[], int first, int mid, int last, int temp[]){ 6 int i = first, j = mid + 1; 7 int m = mid, n = last; 8 int k = 0; 9 10 //通过循环将2个数组比较后有序的放入到临时数组temp中 11 while (i <= m && j <= n) { 12 if (a[i] <= a[j]) { 13 temp[k++] = a[i++]; 14 } 15 else { 16 temp[k++] = a[j++]; 17 } 18 } 19 while (i <= m) { 20 temp[k++] = a[i++]; 21 } 22 while (j <= n) { 23 temp[k++] = a[j++]; 24 } 25 //将排好序的临时数组重新放置到原数组a中 26 for (i = 0; i < k; i++) { 27 a[first + i] = temp[i]; 28 } 29 } 30 31 //使用递归将数组a变成若干有序的小的数组 32 void mergesort(int a[], int first, int last, int temp[]) 33 { 34 if (first < last) 35 { 36 int mid = (first + last) / 2; 37 mergesort(a, first, mid, temp); //左边有序 38 mergesort(a, mid + 1, last, temp);//右边有序 39 mergearray(a, first, mid, last, temp); 40 } 41 } 42 43 //使用归并排序 44 bool MergSort(int a[], int n) 45 { 46 int *p = new int ; 47 if (p == NULL) return false; 48 mergesort(a, 0, n - 1, p); 49 delete[] p; 50 return true; 51 } 52 53 int main(int argc, const char * argv[]) 54 { 55 system("color 5F"); 56 57 int a[10] = { 2, 1, 3, 7, 106, 8, 9, 5, 4, 76 }; 58 MergSort(a, 10); 59 for (int i = 0; i < 10; i++){ 60 cout << a[i] << endl; 61 } 62 63 system("pause"); 64 return 0; 65 }
相关文章推荐
- ACM:归并排序,以及利用归并排序思想求解逆序对数!
- 排序-归并排序
- 单链表(排序,归并排序)
- 七大内部排序算法总结(插入排序、希尔排序、冒泡排序、简单选择排序、快速排序、归并排序、堆排序)
- 七大内部排序算法总结(插入排序、希尔排序、冒泡排序、简单选择排序、快速排序、归并排序、堆排序)
- 二分查找,快速排序,归并排序
- 基于JAVA的排序算法之六--归并排序
- 算法——高级排序——快速排序,归并排序,希尔排序
- 三种排序算法(归并排序、快速排序,堆排序)
- 排序算法之归并排序 java
- 排序——归并排序
- 面试珠玑 快速排序、希尔排序、插入排序、选择排序、归并排序、堆排序总结
- 4.比较排序之归并排序(递归)
- 排序(四)之归并排序
- 自顶向下的归并排序和自底向上的归并排序
- 17. 数据结构进阶十七排序实现之归并排序
- 算法导论-排序(一)-插入排序、归并排序
- 《大话数据结构》第9章 排序 9.8 归并排序(下)
- 第十六周 -项目1 -算法验证 (7)归并排序 (8)基数排序
- 经典内部排序: 堆排序,快排,归并排序