经典排序之 二路归并排序
今天最后研究一下二路归并排序
算法思想:
利用递归,将原始序列不断两两分块,知道每块剩下一个元素,这个元素肯定是有序的。然后利用递归的原理合并即可;
二路归并排序的最好,最坏,和平均时间复杂度为O(nlgn);是一种稳定的排序
算法实现:
1 #include<iostream> 2 using namespace std; 3 4 void Merge(int data[], int low, int mid, int high) 5 { 6 int i = low, j = mid + 1, k = 0; 7 int *temp = new int[high - low + 1]; //temp数组暂存合并的有序序列 8 9 if(!temp) //内存分配失败 10 { 11 cout<<"ERROR!"; 12 return; 13 } 14 15 while(i <= mid && j <= high) //顺序选取两个有序区的较小元素,存储到t数组中 16 { 17 if(data[i] <= data[j]) //较小的先存入temp中 18 temp[k++] = data[i++]; 19 else 20 temp[k++] = data[j++]; 21 } 22 23 while(i <= mid) //若比较完之后,第一个有序区仍有剩余,则直接复制到t数组中 24 temp[k++] = data[i++]; 25 while(j <= high) //同上 26 temp[k++] = data[j++]; 27 for(i=low, k=0; i <= high; i++, k++) //将排好序的存回data中low到high这区间 28 data[i] = temp[k]; 29 delete [ ]temp; //删除指针,由于指向的是数组,必须用delete [] 30 } 31 32 33 void MergeSort(int data[], int low, int high) 34 { //用递归应用二路归并函数实现排序——分治法 35 if(low<high) //(是if,不是while!,且不含等号!否则死循环!) 36 { 37 int mid = (low + high) / 2; 38 MergeSort(data, low, mid); 39 MergeSort(data, mid + 1, high); 40 Merge(data, low, mid, high); 41 } 42 } 43 44 int main() 45 { 46 int x[ ] = {0, 5, 33, 1, 8, 7, 23, 3}; 47 MergeSort(x, 0, 7); 48 for(int i = 0; i < 8; i++) 49 cout<<x[i]<<" "; 50 return 0; 51 }