1.歸併排序算法
歸併排序採用的思想是分而治之,簡單來講,就是將一個待排序的序列,不斷劃分,最終獲得有序的序列(只剩一個元素的序列就是有序序列),而後將這些有序的序列進行合併,第一次合併將只有一個元素序列的有序子序列進行合併,就會獲得有兩個元素序列的有序子序列,而後進行第二次合併,將有兩個元素序列的有序序列進行合併,就會獲得有四個元素序列的有序序列,如此下去,直到所有元素有序。數組
舉個例子就會一目瞭然:spa
待排序序列:1 -9 3 8 6 2 3 -1code
第一次劃分:1 -9 3 8 6 2 3 -1 獲得兩個序列blog
第二次劃分:1 -9 3 8 6 2 3 -1 獲得四個序列排序
第三次劃分 :1 -9 3 8 6 2 3 -1 獲得8個序列,此時每一個序列都是有序的,由於只有一個元素遞歸
合併io
第一次合併:-9 1 3 8 2 6 -1 3 獲得四個有序序列class
第二次合併:-9 1 3 8 -1 2 3 6 獲得兩個有序序列效率
第三次合併:-9 -1 1 2 3 3 6 8 獲得一個有序序列,排序完成。
2.步驟
1 #include<stdio.h> 2 void merge(int * arr,int left,int mid,int right) 3 { 4 int i=left;//左邊子序列的起點 5 int j=mid+1;//右邊子序列的起點 6 int temp[10];//暫時數組 7 int n=0;//本次合併元素的個數 8 9 //比較兩個序列,將符合要求的元素放進temp數組 10 while(i<=mid&&mid<=right) 11 { 12 if(arr[i]<arr[j]) 13 temp[n++]=arr[i++]; 14 else 15 temp[n++]=arr[j++]; 16 } 17 //若是左邊序列還有剩 18 while(i<mid) 19 temp[n++]=arr[i++]; 20 21 //若是有邊序列還有剩 22 while(j<=right) 23 temp[n++]=arr[j++]; 24 25 //將排序好的元素放回本來數組對應的位置 26 for(i=0;i<n;i++) 27 arr[left++]=temp[i]; 28 } 29 void mergeSort(int * arr,int left,int right) 30 { 31 32 if(left<right) 33 { 34 int mid=(left+right)/2;//分治 35 mergeSort(arr,left,mid);//遞歸左邊序列 36 mergeSort(arr,mid+1,right);//遞歸右邊序列 37 merge(arr,left,mid,right);//開始合併 38 } 39 40 } 41 int main() 42 { 43 int i; 44 int arr[10]={1,3,-9,0,10,2,8,9,19,-1}; 45 mergeSort(arr,0,9);//歸併排序 46 for(i=0;i<10;i++) 47 printf("%d\n",arr[i]); 48 return 0; 49 }
結果:
歸併排序的時間複雜度是:O(nlog₂n)是一種效率很高的算法,而且是穩定的排序算法。穩定是指在排序的時候,相等的元素不會進行交換。