[排序算法] 归并排序
归并排序
【思想】
·简单地将原始序列划分为两个子序列
·分别对每个子序列递归排序
·最后将排好序的子序列合并为一个有序序列,即归并过程
【特点】稳定
空间代价:O(n)
时间代价:O(nlogn)
注:
·尽管归并排序最坏比较次数比快速排序少,但它需要更多地元素移动,因此它在实用中不一定比快速排序快
·一般二路归并算法需要另外一个存储空间来存储排好序的数组,空间复杂度为O(n)
二路归并算法(需要另外存储空间)
1 void Merge(int array[], int left, int middle, int right, int temp[]) 2 { 3 int i = left,j = middle + 1,k = 0; 4 while(i <= middle && j <= right) 5 { 6 if(array[i] > array[j]) 7 { 8 temp[k ++] = array[j ++]; 9 } 10 else 11 { 12 temp[k ++] = array[i ++]; 13 } 14 } 15 while(i <= middle) 16 { 17 temp[k ++] = array[i ++]; 18 } 19 while(j <= right) 20 { 21 temp[k ++] = array[j ++]; 22 } 23 for(int p = 0;p < k;p ++) 24 { 25 array[left + p] = temp[p]; 26 } 27 } 28 void MergeSort(int array[], int left, int right) 29 { 30 if (left < right) 31 { 32 int *temp = new int[right - left + 1]; 33 int middle = (left+right)/2; 34 MergeSort(array, left, middle); 35 MergeSort(array, middle + 1, right); 36 Merge(array, left, middle, right,temp); 37 } 38 }