编号 题目 状态 分数 总时间 内存 代码 / 答案文件 提交者 提交时间
#33592 #1. 快速排序 Accepted 100 32 ms 1016 K C / 1.8 K 2024210452 2025-03-23 11:48:46
显示原始代码
#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
int arr[2][100000] = { 0 };
void error(int x)  // x表示数组元素个数,使用归并算法
{
    int ex = 0;  //记录目前操作的数组
    int x1;      //表示元素位置,与x对应
    int *i = &arr[0][0], *j = &arr[0][1];
    int* bi = &arr[1][0];
    int len = 1;                      //每个分离数组的长度
    for (len = 1; len < x; len *= 2)  //根据数组总长度进行循环
    {
        for (x1 = 0; x1 < x; x1 += (2 * len))  //根据数组元素位置进行每一次归并
        {
            for (i = &arr[ex % 2][x1], j = &arr[ex % 2][x1 + len], bi = &arr[1 - ex % 2][x1];
                 1;)  //归并相邻的两个数组
            {
                if (j >= &arr[ex % 2][x]) {
                    for (; i < &arr[ex % 2][x1 + len] && i < &arr[ex % 2][x]; i++, bi++) {
                        *bi = *i;
                    }
                    break;
                } else if (*i > *j) {
                    *bi = *j;
                    j++;
                    bi++;
                    if (j >= &arr[ex % 2][x1 + 2 * len] || j >= &arr[ex % 2][x]) {
                        for (; i < &arr[ex % 2][x1 + len]; i++, bi++) {
                            *bi = *i;
                        }
                        break;
                    }
                } else {
                    *bi = *i;
                    i++;
                    bi++;
                    if (i >= &arr[ex % 2][x1 + len] || i >= &arr[ex % 2][x]) {
                        for (; j < &arr[ex % 2][x1 + 2 * len] && j < &arr[ex % 2][x]; j++, bi++) {
                            *bi = *j;
                        }
                        break;
                    }
                }
            }
        }
        ex += 1;
    }
    if (ex % 2 == 1)  //奇数说明最后的规律数组是arr[1],并非arr[0],进行转换,保证我们处理的是arr[0]
    {
        for (x1 = 0; x1 < x; x1++) {
            arr[0][x1] = arr[1][x1];
        }
    }
}
int main() {
    int n, n1;
    scanf("%d", &n);
    for (n1 = 0; n1 < n; n1++)  //输入数据
    {
        scanf("%d", &arr[0][n1]);
    }
    error(n);
    for (n1 = 0; n1 < n; n1++) {
        printf("%d ", arr[0][n1]);
    }
    return 0;
}
子任务 #1
Accepted
得分:100
测试点 #1
Accepted
得分:100
用时:32 ms
内存:1016 KiB

输入文件(2.in

100000
548813502 592844616 715189364 844265744 602763370 857945619 544883177 847251737 423654796 62
<988624 bytes omitted>

答案文件(2.out

4010 20029 24208 32576 46285 55350 60569 72453 73696 99348 140054 145665 150375 163096 166440 186713
<988615 bytes omitted>

用户输出

4010 20029 24208 32576 46285 55350 60569 72453 73696 99348 140054 145665 150375 163096 166440 186713 187112 200094 201277 206954
<988587 bytes omitted>

系统信息

Exited with return code 0