题解 | #排序#

排序

https://www.nowcoder.com/practice/508f66c6c93d4191ab25151066cb50ef

#include <stdio.h>
#include <stdlib.h>

#define Nmax 100

void merge(int numList[], int first, int mid, int last) {

    int i, j;

    //每次需要排序的divided数组大小都不一样
    //进行动态分配临时数组
    int* tmp = (int*)malloc((last - first + 1) * sizeof(int));

    int L_low = first;
    int L_high = mid;
    int R_low = mid + 1;
    int R_high = last;

    //1.compare与copy,L R 比较完后移,排序结果先进tmp数组

    for (i = 0; L_low <= L_high && R_low <= R_high; i++) {
        if (numList[L_low] < numList[R_low]) {
            tmp[i] = numList[L_low];
            L_low++;
        } else {
            tmp[i] = numList[R_low];
            R_low++;
        }
    }

    //2.L left
    if (L_low <= L_high) {
        for (j = L_low; j <= L_high; j++) {
            tmp[i] = numList[j];
            i++;
        }
    }
    //3.R left
    if (R_low <= R_high) {
        for (j = R_low; j <= R_high; j++) {
            tmp[i] = numList[j];
            i++;
        }
    }


    //4.copy 回numList\
    //注意递归,所以first+i
    for (i = 0; i < last - first + 1; i++) {
        numList[first + i] = tmp[i];
    }
    free(tmp);//


}

void merge_sort(int numList[], int first, int last) {

    int mid;

    if (first < last) {
        mid = (first + last) / 2;
        //对Left进行递归分割
        merge_sort(numList, first, mid);
        //对Right进行递归分割
        merge_sort(numList, mid + 1, last);
        merge(numList, first, mid, last);

    }


}





int main() {
    int N, i;
    int numList[Nmax];

    //1.input
    scanf("%d", &N);
    for (i = 0; i < N; i++) {
        scanf("%d", &numList[i]);

    }
    //2.func
    merge_sort(numList, 0, N - 1);


    //3.output
    for (i = 0; i < N; i++) {
        printf("%d ", numList[i]);
    }



}

全部评论
详细解释:https://blog.csdn.net/weixin_53116058/article/details/132702698?spm=1001.2014.3001.5502
点赞 回复 分享
发布于 2023-09-06 22:09 海南

相关推荐

02-25 13:02
中南大学 C++
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务