C 归并排序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010095372/article/details/84453488

有点点像希尔排序的整齐版 但是更像快速排序
如果有两个有序的数组合并成一个的话会省下好多时间,那我就把一个数组分成两个,每个弄成有序的。那…我把分下的两个数组,再按这个这个办法,一直分下去,直到一个子数组里面只有一个元素,再合合合起来。
分————治————合
老师还给您的知识,我今天再拿回来吧

总跟两个有序单链表和一个有序单链表一样的

//弄一个辅助数组
int b[10];
void Merge(int a[], int low, int mid, int high) {
    int k, i, j;
    //拷贝
    for (k = low; k <= high; k++) {
        b[k] = a[k];
    }
    //双线作战b[low...mid] b[mid+1...high]
    for (i = low, j = mid+1, k = i; i <= mid && j <= high; k++) {
        if(b[i] < b[j])
        {
            a[k] = b[i++];
        }else {
            a[k] = b[j++];
        }
    }
    //完成后在a中就ok了
    //剩下那边还有富余就直接接上去
    while (i <= mid) {
        a[k++] = b[i++];
    }
    while (j <= high) {
        a[k++] = b[j++];
    }
}

void MergeSort(int a[], int low, int high){
    if(low < high) {
        int mid = (low + high)/2;
        MergeSort(a, low, mid);
        MergeSort(a, mid+1, high);
        Merge(a, low, mid, high);
    }
}

89 7 6 5 43210
789 6 5 43210
789 56 43210
56789 4 3 2 1 0
56789 34 2 1 0
56789 234 1 0
56 789 234 01
56789 01234
0123456789
0123456789

猜你喜欢

转载自blog.csdn.net/u010095372/article/details/84453488
今日推荐