合并排序

View Code
#include <stdio.h>

void merge(int A[],int tmp[],int left,int right,int end);
void mergeSort(int A[],int tmp[],int begin,int end);
void mergeSort(int A[],int tmp[],int begin,int end){
    if((end-begin)>0){
        int mid=begin+(end-begin)/2;
        mergeSort(A,tmp,begin,mid);
        mergeSort(A,tmp,mid+1,end);
        merge(A,tmp,begin,mid+1,end);
    }
}
void merge(int A[],int tmp[],int left,int right,int end){
    int i=left;int j=right;
    int m=left;
    while(i<right&&j<=end){
        if(A[i]>A[j]){
            tmp[left++]=A[i];
            i++;
        }
        if(A[i]<=A[j]){
            tmp[left++]=A[j];
            j++;
        }
            
    }
    if(i==right){
        while(j<=end){
            tmp[left++]=A[j++];
        }
    }
    if(j>end){
        while(i<right){
            tmp[left++]=A[i++];
        }
    }
    for(;m<=end;m++){
        A[m]=tmp[m];
    }
}
int main(){
    int A[5]={3,1,5,4,2};
    int tmp[6];
    mergeSort(A,tmp,0,4);
    int i=0;
    for(;i<5;i++){
        printf("%d ",A[i]);
    }
    return 0;
}

合并排序利用了分治的思想,无论好坏,时间复杂度都为O(N logN),因为分治后的高度为logN,每次比较都要进行N次。但是它需要和数组一样规模的额外空间。

posted on 2012-06-04 08:57  蓝色守望  阅读(150)  评论(0)    收藏  举报

导航