归并排序

来源:互联网 发布:好玩的c语言小程序 编辑:程序博客网 时间:2024/06/04 18:23

归并排序的主体思想就是先对半拆分,直到拆成只有一个元素(一个元素必然有序);然后再逐层合并,合并有序的数组。
C语言实现:

/**实现归并排序的函数,主题思想是先拆分,然后合并有序序列*params:*   arr:需要排序的数组*   reg:装载临时序列的数组*   start:子序列的起始位置*   end:子序列的终止位置*/void merge_solve(int arr[], int reg[], int start, int end){    if(start >= end)                                                              //仅有一个元素或者无元素时返回        return;    int len = end - start;                                                        //表示尾首之间元素个数    int mid = start + (len / 2);                                                  //中间元素    //截成两部分    int start1 = start;    int end1 = mid;    int start2 = mid + 1;    int end2 = end;    merge_solve(arr, reg, start1, end1);                                          //先分开,后合并    merge_solve(arr, reg, start2, end2);    int k = start;    //合并两个已经有序的序列    while(start1 <= end1 && start2 <= end2){        reg[k++] = arr[start1] < arr[start2] ? arr[start1++] : arr[start2++];     //赋值较小者    }    //如果剩余的是前半部分,则用其填满reg的后面    while(start1 <= end1){        reg[k++] = arr[start1++];    }    //如果剩余的是后半部分    while(start2 <= end2){        reg[k++] = arr[start2++];    }    for(k = start; k <= end; k++)                                                 //将结果传回arr,便于递归        arr[k] = reg[k];}int main(){    int A[9] = {6, 9, 2, 12, 75, 96, 45, 32, 2};    int B[9];    merge_solve(A, B, 0, 8);    for(int i = 0; i < 9; i++)        printf("%d ", A[i]);    printf("\n");    return 0;}