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


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

 

1、算法特性

  歸並排序是一種高效且穩定的排序方法,其速度僅次於快速排序,但比較占用內存。

  其時間復雜度最好、最差、平均情況均為O(nlog(2)n),空間復雜度為O(n)。

 

2、算法思路

  采用分治法的思路將問題分解、細化、逐個解決,即通過遞歸將無序序列不斷分解,直到分解成序列有序(當序列長度為1時一定有序)。再將分解的有序序列不斷合並成新的有序序列,最后合並成一個有序序列。

 

 

3、實現代碼

 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 }

 

4、測試結果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM