使用快速排序对长度为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;
}