核心思想:将一组数据分成若干个组,即分到每组只有一个数据时就不用再分了。然后分别比较每两组数据元素的大小,将其合并成一组数据,再去和其他同等级别的组的数据元素进行比较、合并,且将合并后的数据放到到临时的空间中,然后在复制给原始空间,以此类推,直到最后合并完毕。
1、递归算法
4 void MergeSort(int *arr,int left,int mid,int right,int *temp)
5 {
6 int begin1 = left;
7 int begin2 = mid+1;
8 int index = left;
9
10 while(begin1 <= mid && begin2 <= right)
11 {
12 if(arr[begin1] < begin2)
13 temp[index++] = arr[begin1++];
14 else
15 temp[index++] = arr[begin2++];
16 }
17
18 while(begin1 <= mid)
19 temp[index++] = arr[begin1++];
20 while(begin2 <= right)
21 temp[index++] = arr[begin2++];
22
23 while(left <= right)
24 arr[left++] = temp[left++];
25 }
26
27 void Merge(int *arr,int left,int right,int *temp)
28 {
29 if(left < right)
30 {
31 int mid = (right-left)/2+left;
32 Merge(arr,left,mid,temp);
6 int begin1 = left;
7 int begin2 = mid+1;
8 int index = left;
9
10 while(begin1 <= mid && begin2 <= right)
11 {
12 if(arr[begin1] < begin2)
13 temp[index++] = arr[begin1++];
14 else
15 temp[index++] = arr[begin2++];
16 }
17
18 while(begin1 <= mid)
19 temp[index++] = arr[begin1++];
20 while(begin2 <= right)
21 temp[index++] = arr[begin2++];
22
23 while(left <= right)
24 arr[left++] = temp[left++];
25 }
1 #include<iostream>
2 using namespace std;
3
4 void MergeSort(int *arr,int left,int mid,int right,int *temp)
5 {
6 int begin1 = left;
7 int begin2 = mid+1;
8 int index = left;
9
10 while(begin1 <= mid && begin2 <= right)
11 {
12 if(arr[begin1] < begin2)
13 temp[index++] = arr[begin1++];
14 else
15 temp[index++] = arr[begin2++];
16 }
17
18 while(begin1 <= mid)
19 temp[index++] = arr[begin1++];
20 while(begin2 <= right)
21 temp[index++] = arr[begin2++];
22
23 while(left <= right)
24 arr[left++] = temp[left++];
25 }
26
27 void Merge(int *arr,int left,int right,int *temp)
28 {
29 if(left < right)
30 {
31 int mid = (right-left)/2+left;
32 Merge(arr,left,mid,temp);
33 Merge(arr,mid+1,right,temp);
34 MergeSort(arr,left,mid,right,temp);
35 }
36 }
2、非递归算法
归并排序的非递归算法是直接从底部向上开始的,同样也要比较合并的算法。
39 void MergeNor(int *arr,int left,int right,int *temp)
40 {
41 int gap = 1;
42 while(gap <= right)
43 {
44 for(int i = 0; i < right; i+=2*gap)
45 {
46 int begin = i;
47 int mid = i+gap-1;
48 int end = mid+gap;
49 if(end > right)
50 end = right;
51
52 MergeSort(arr,begin,mid,end,temp);
53 }
54 gap = 2*gap;
55 }
56 }