[C語言] 歸併排序的特性及實現算法
一、算法特性數組
歸併排序是一種高效且穩定的排序方法,其速度僅次於快速排序,但比較佔用內存。測試
其時間複雜度最好、最差、平均狀況均爲O(nlog(2)n),空間複雜度爲O(n)。spa
二、算法思路code
採用分治法的思路將問題分解、細化、逐個解決,即經過遞歸將無序序列不斷分解,直到分解成序列有序(當序列長度爲1時必定有序)。再將分解的有序序列不斷合併成新的有序序列,最後合併成一個有序序列。blog
三、實現代碼排序
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 // 歸併排序:arr [left,mid]區間升序 [mid+1,rigth]升序 合併這個數組的數據使之升序 5 void merge(int arr[],int left,int mid,int rigth) 6 { 7 int len = mid-left+1; 8 int* p = malloc(sizeof(int)*len); 9 // 把[left,mid-1]區間的數據移動到p指向的內存 10 // memcpy(prr,arr+left,l1*sizeof(int)); 11 for(int i=0; i<len; i++) 12 { 13 p[i] = arr[left+i]; 14 } 15 // 把p[0,len-1] arr[mid,rigth]兩部分數據合併到 arr[left,rigth]數組裏 16 int i = 0; 17 int j = mid+1; 18 int k = left; // 從left開始放 19 while(i<len && j<=rigth) 20 { 21 if(p[i] < arr[j]) 22 { 23 arr[k++] = p[i++]; 24 } 25 else 26 { 27 arr[k++] = arr[j++]; 28 } 29 } 30 while(i < len) 31 { 32 arr[k++] = p[i++]; 33 } 34 } 35 36 // 通鋪使arr left-rigth區間有序 37 void _merge_sort(int arr[],int left,int rigth) 38 { 39 if(left >= rigth) // 只有一個數據 那原本就有序 40 { 41 return; 42 } 43 int mid = (left+rigth)/2; 44 // left mid mid+1 rigth 45 if(mid > left) 46 { 47 _merge_sort(arr,left,mid); // 讓數組 [left,mid]有序 48 } 49 if(rigth > mid+1) 50 { 51 _merge_sort(arr,mid+1,rigth); // 讓數組 [mid+1,rigth]有序 52 } 53 merge(arr,left,mid,rigth); // 合併 54 } 55 56 void merge_sort(int arr[],int len) 57 { 58 _merge_sort(arr,0,len-1); 59 } 60 61 void travel(int arr[],int len) 62 { 63 for(int i=0; i<len; i++) 64 { 65 printf("%d ",arr[i]); 66 } 67 printf("\n"); 68 } 69 70 int main() 71 { 72 int arr[] = {53,82,9,233,43,14,55,9,4,67}; 73 int len = sizeof(arr)/sizeof(arr[0]); 74 75 travel(arr,len); 76 merge_sort(arr,len); 77 travel(arr,len); 78 79 return 0; 80 }
四、測試結果遞歸