今天最后研究一下二路歸並排序
算法思想:
利用遞歸,將原始序列不斷兩兩分塊,知道每塊剩下一個元素,這個元素肯定是有序的。然后利用遞歸的原理合並即可;
二路歸並排序的最好,最壞,和平均時間復雜度為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 }