Jaspas_Di 2024-12-24 18:31 采纳率: 50%
浏览 9
已结题

快速排序花费时间极长,找不到原因

使用快速排序对长度为1,000,000的数组进行排序,需要耗时1-2小时,发给朋友跑,也花了一个小时,排除了电脑问题

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

#define ARRAY_SIZE 1000000

void CreLis(int *, int n, int left, int right);
void JudCho(int *, int left, int right);
int FasCho(int *, int left, int right);

int main(int argc, char* argv[]) {
    int* arr = (int*)malloc(ARRAY_SIZE * sizeof(int));
    CreLis(arr, ARRAY_SIZE, 1, 100);  //随机生成数组,可以正常运行并且耗时极短,不影响程序速度

    clock_t start = clock();
    JudCho(arr,0,999999);
    clock_t end = clock();

    int time = (end - start) / CLOCKS_PER_SEC;
    printf("%d", time);


    free(arr);
    return 0;
}

void CreLis(int *arr, int n, int left, int right) {
    srand(time(0));
    for (int i = 0;i < n;i++) {
        arr[i] = rand() % (right - left + 1) + left;
    }
    printf("List Created");  //给自己判断有没有生成完
}

void JudCho(int *arr, int left, int right) {      //分治
    if (left < right) {
        printf("One Tap\n");
        int pos = FasCho(arr, left, right);    //获得边界点
        
        JudCho(arr, 0, pos - 1);
        JudCho(arr, pos + 1, right);
    }
}

int FasCho(int *arr, int left, int right) {      //进行排序
    int base = arr[left];
    while (left < right) {
        while (left != right && arr[right] >= base) {
            right--;
        }
        arr[left] = arr[right];
        while (left != right && arr[left] <= base) {
            left++;
        }
        arr[right] = arr[left];
    }
    arr[left] = base;
    return left;
}

  • 写回答

3条回答 默认 最新

  • micthis 2024-12-24 20:19
    关注

    1
    第一个递归调用左边界应该是left不是0
    2
    递归函数中不要有输出
    改成:

    void JudCho(int *arr, int left, int right) {      //分治
        if (left < right) {
            //printf("One Tap\n");
            int pos = FasCho(arr, left, right);    //获得边界点
            //JudCho(arr, 0, pos - 1);
            JudCho(arr, left, pos - 1);
            JudCho(arr, pos + 1, right);
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 1月2日
  • 已采纳回答 12月25日
  • 创建了问题 12月24日