歸併排序--二路排序

l2xBrain發表於2019-05-11

先直接給出程式碼:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void mergeArray(int *a,int left,int mid,int right,int *tmp){
    
    int i = left,m = mid,j = mid+1,n = right;
    int k = 0;
    //從兩個陣列中各取出一個數值,進行比較
    while(i <= m && j <= n){
        if(a[i] <= a[j]){
            tmp[k++] = a[i++];
        }else{
            tmp[k++] = a[j++];
        }
    }
    //將剩餘的值賦值給臨時陣列
    while(i <= m){
        tmp[k++] = a[i++];
    }
    while(j <= n){
        tmp[k++] = a[j++];
    }
    //將臨時陣列複製到目標陣列
    for(i = 0; i < k; i++){
        a[left + i] = tmp[i];
    }
    
}

void mergeSort(int *a,int left, int right,int *tmp){
    if(left < right){
        int mid = (left+right)/2;
        mergeSort(a,left,mid,tmp);
        mergeSort(a,mid+1,right,tmp);
        
        mergeArray(a,left,mid,right,tmp);
    }
}

int main(){
    int a[] = {3,6,7,5,4,3,8,9,3};
    
    int b[sizeof(a)/sizeof(int)];
    
    mergeSort(a,0,sizeof(a)/sizeof(int) - 1,b);
    
    for(int i = 0; i < sizeof(a)/sizeof(int); i++){
        printf("%d
", a[i]);
    }
    
    return 0;
}


給出歸併排序的過程:
1.將一個陣列按照每一次分兩個陣列,子陣列也像這樣一樣分下去,直到陣列中只剩下了一個元素

2.根據第一步的結果,從左右兩個陣列中,分別在選出一個資料,比較她們的大小,將比較小的寫入到目標陣列中,直到其中的一方沒有了資料,然後將另一方加在資料的後面

相關文章