各种排序总结(六)归并排序
1 /**************** 2 思路:假设待排序有n个记录,将这n个记录看成n个有序的子序列,每个子序列长度为1, 3 然后两两归并。 4 如何将将二个有序数列合并:这个非常简单,只要从比较二个数列的第一个数, 5 谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空, 6 那直接将另一个数列的数据依次取出即可。 7 ****************/ 8 #include <iostream> 9 10 using namespace std; 11 12 //将有二个有序数列arr[first...mid]和arr[mid...last]合并。主要是merge这个函数 13 void Merge(int* arr, int first, int mid, int last, int* temp) 14 { 15 int f1 = first; 16 int m = mid; 17 int f2 = mid+1; 18 int l = last; 19 int i = 0; 20 while((f1 <= m)&&(f2 <= l)) 21 { 22 if(arr[f1] < arr[f2]) 23 temp[i++] = arr[f1++]; 24 else 25 temp[i++] = arr[f2++]; 26 } 27 while(f1 <= m) 28 temp[i++] = arr[f1++]; 29 while(f2 <= l) 30 temp[i++] = arr[f2++]; 31 for(int j=0; j<i; j++) 32 arr[first + j] = temp[j]; 33 } 34 35 36 void MergeSort(int* arr, int first, int last, int* temp) 37 { 38 int mid; 39 if(first < last) //if first >= last, return 40 { 41 mid = (first + last) /2; 42 MergeSort(arr, first, mid, temp); 43 MergeSort(arr, mid+1, last, temp); 44 Merge(arr,first, mid, last, temp); 45 } 46 } 47 48 49 int main() 50 { 51 int * arr; 52 int * temp; 53 int n; 54 cout<<"Input the arr length:"<<endl; 55 cin>>n; 56 arr = new int[n]; 57 temp = new int[n]; 58 cout<<"Input the arr elements:"<<endl; 59 for(int i=0;i<n;i++) 60 { 61 cin>>arr[i]; 62 } 63 MergeSort(arr,0,n-1,temp); 64 cout<<"The outcome:"<<endl; 65 for(int i=0;i<n;i++) 66 cout<<arr[i]<<endl; 67 return 0; 68 } 69 /************************ 70 稳定的。 71 时间复杂度:归并排序不依赖与原始数组的输入情况,每次划分时两个子序列长度都是基本一样的, 72 因此最大、最小和平均时间均为O(nlogn)。 73 空间复杂度:用到一个临时数组,因此空间代价为O(n)。 74 总结: 75 1.排序时间不依赖于原始数组; 76 2.时间为O(nlogn),因此适用于数组n较大的情况; 77 3.空间代价为O(n)。 78 *************************/