[C語言] 歸併排序的特性及實現

[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 }

 

四、測試結果遞歸

相關文章
相關標籤/搜索