您的位置:首页 > 其它

排序——归并排序

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次
 

实现的代码如下:

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 }


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法