归并排序

思路

    1. 分解(将一个数组拆分成两个数组)
    2. 合并(将两个有序的数组合并成一个有序的数组,借助一个辅助数组)

代码

#include <stdio.h>

// 将arr[l...mid]和arr[mid+1...r]两部分进行归并

void __merge(int arr[], int l, int mid, int r){
    
    // 经测试,传递aux数组的性能效果并不好
    int aux[r-l+1];//设置辅助数组
    for( int i = l ; i <= r; i ++ ){
        aux[i-l] = arr[i];
    }
    int i = l, j = mid+1;
    //将辅助数组中拆分的两部分有序的插入原数组中
    for( int k = l ; k <= r; k ++ ){
        if( i > mid ){
            arr[k] = aux[j-l]; j ++;
        }else if( j > r ){
            arr[k] = aux[i-l]; i ++;
        }else if( aux[i-l] < aux[j-l] ){
            arr[k] = aux[i-l]; i ++;
        }else{
            arr[k] = aux[j-l]; j ++;
        }
    }
}

// 递归使用归并排序,对arr[l...r]的范围进行排序

void __mergeSort(int arr[], int l, int r){
    
    if( l >= r ){//不能再次拆分则直接返回
        return;
    }
    //能继续拆分进行拆分
    //int mid = (l+r)/2;
    int mid = l+(r-l)/2;    //这样比上面的写法更好
    __mergeSort(arr, l, mid);
    __mergeSort(arr, mid+1, r);
    //进行合并
    __merge(arr, l, mid, r);
}


void mergeSort(int arr[], int n){
    
    __mergeSort( arr , 0 , n-1 );
}


int main() {
    
    int arr[10] = {2,4,8,6,5,7,3,9,1,0};
    mergeSort(arr, 10);
    for (int i=0; i<10; i++) {
        printf("%d\n",arr[i]);
    }
    return 0;
}
posted @ 2017-05-16 11:39  郑闯  阅读(136)  评论(0编辑  收藏  举报