歸併排序MergeSort算法--分治

    歸併排序(MergeSort)是一種有效的排序算法,該算法是採用分治法(Divide and Conquer)的一個很是典型的應用。將已有序的子序列合併,獲得徹底有序的序列;即先使每一個子序列有序,再使子序列段間有序。若將兩個有序表合併成一個有序表,稱爲二路歸併。
    歸併過程爲:比較a[i]和a[j]的大小,若a[i]≤a[j],則將第一個有序表中的元素a[i]複製到r[k]中,並令i和k分別加上1;不然將第二個有序表中的元素a[j]複製到r[k]中,並令j和k分別加上1,如此循環下去,直到其中一個有序表取完,而後再將另外一個有序表中剩餘的元素複製到r中從下標k到下標t的單元。歸併排序的算法咱們一般用遞歸實現,先把待排序區間[s,t]以中點二分,接着把左邊子區間排序,再把右邊子區間排序,最後把左區間和右區間用一次歸併操做合併成有序的區間[s,t]。
    歸併排序速度僅次於快速排序(但快速排序處理總體已經很是有序的數組時速度不如歸併排序),爲穩定排序算法,通常用於對整體無序,可是各子項相對有序的數組。
#include <stdio.h>
#include <stdlib.h>
void merge(int a[],int lo,int p,int hi, int temp[]){
    int i = lo,j = p+1;
    int k = 0;
    while (i<=p && j<=hi) {
        if (a[i] <= a[j]) {
            temp[k++] = a[i++];
        } else {
            temp[k++] = a[j++];
        }
    }
        while (i<=p) {
            temp[k++] = a[i++];
        }
        while (j<=lo) {
            temp[k++] = a[j++];
        }
    for (i=0;i<k;i++) {
        a[lo+i] = temp[i];
    }
}
void mergesort(int a[],int lo,int hi,int temp[])
{
    if(lo < hi)
    {
        int p= (lo+hi)/2;
        mergesort(a, lo, p, temp);
        mergesort(a, p+1, hi, temp);
        merge(a, lo, p, hi, temp);
    }
}
MergSort(int a[],int n)
{
    int *p = malloc(sizeof(int[n]));
    mergesort(a, 0, n-1, p);
    free(p);
}
int main()
{
    int i=0,a[10];
    for(i=0;i<10;i++){
        scanf("%3d",&a[i]);
    }
    MergSort(a, 10);
    for(i=0;i<10;i++){
        printf("%3d",a[i]);
    }
    return 0;
}

 

 

MergeSort用分治法對n個元素進行排序,用分、治、合三部分完成排序。T(n)=2T(n/2)+O(n)。時間複雜度爲O(nlgn)算法

相關文章
相關標籤/搜索