基礎算法之歸並排序


歸並排序也是一種常用的排序算法, 其時間復雜度為O(n*logn), 它的基礎是分治的思想。

其基本思路就是把數組分成兩組A,B, 如果這兩組內的數據都是有序的, 那么就可以很方便的對這兩組數據進行合並排序。

但是如何讓這兩組數據有序呢? 歸並法的思想就是把A,B兩組各自再分成兩組, 依次類推, 當分出來的小組數據只有一個的時候, 即可以認為小組數據已經達到了有序

然和合並相鄰的兩個小組就OK了~

歸並法的C語言實現如下:

 1 //合並數組的前半部分和后半部分, 前提就是前后兩個子數組分別都已經排好序了
 2 void mergeArray(int a[], int first, int mid, int last) {
 3     
 4     int i, j, m, n;
 5     i = first, m = mid;
 6     j = mid+1, n = last;
 7     int k = 0;
 8     int temp[SIZE];
 9 
10     while(i<=m && j<=n) {
11         if(a[i] < a[j]) {
12             temp[k++] = a[i++];
13         } else {
14             temp[k++] = a[j++];
15         }
16     }
17     
18     while(i<=m) temp[k++] = a[i++];
19     while(j<=n) temp[k++] = a[j++];
20     
21     for(i=0; i<k; i++) {
22         a[first+i] = temp[i];
23     }
24 
25 }
26 //歸並排序
27 void merge_sort(int a[], int start, int end) {
28     int mid = (start+end)/2;
29     if(start<end) {
30         merge_sort(a, start, mid);
31         merge_sort(a, mid+1, end);
32         mergeArray(a, start, mid, end);
33     }
34 }

一個簡單的測試用例,代碼如下:

#include<stdio.h>

#define SIZE 10

//合並數組的前半部分和后半部分, 前提就是前后兩個子數組分別都已經排好序了
void mergeArray(int a[], int first, int mid, int last) {
    
    int i, j, m, n;
    i = first, m = mid;
    j = mid+1, n = last;
    int k = 0;
    int temp[SIZE];

    while(i<=m && j<=n) {
        if(a[i] < a[j]) {
            temp[k++] = a[i++];
        } else {
            temp[k++] = a[j++];
        }
    }
    
    while(i<=m) temp[k++] = a[i++];
    while(j<=n) temp[k++] = a[j++];
    
    for(i=0; i<k; i++) {
        a[first+i] = temp[i];
    }

}
//歸並排序
void merge_sort(int a[], int start, int end) {
    int mid = (start+end)/2;
    if(start<end) {
        merge_sort(a, start, mid);
        merge_sort(a, mid+1, end);
        mergeArray(a, start, mid, end);
    }
}




int main() {
    int a[SIZE];
    int i;
    printf("Please input the num:\n");
    for(i=0; i<SIZE; i++)
    {
        scanf("%d",&a[i]);
    }
    printf("before the sort:\n");
    for(i=0; i<SIZE; i++)
    {
        printf("%d ", a[i]);
    }
    printf("\n");
    
    merge_sort(a, 0, SIZE-1);

    printf("after the sort:\n");
    for(i=0; i<SIZE; i++)
    {
        printf("%d ", a[i]);
    }
    printf("\n");
}
View Code

 


免責聲明!

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



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