gpt4 book ai didi

c - 使用 hibbard 增量的 shell 排序

转载 作者:太空宇宙 更新时间:2023-11-04 03:20:20 25 4
gpt4 key购买 nike

我是 C 的新手。我想在 C 中使用 hibbard 增量对 shell 排序进行实验。而且,为了测试最坏的情况,我总是根据输入大小构建一个反向数组。我希望看到运行时间遵循时间复杂度 O(n^1.5)。但是,我的输出以某种方式遵循时间复杂度 O(n)。以下是我的代码。如果有人能帮助我找到问题所在,我将不胜感激。

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

int get_input() {
int input;
printf("Please type input size(n): ");
if(scanf("%d", &input) == 0) {
fscanf(stdin, "%*[^\n]%*c");
}
return input;
}

int* build_data(int* array, int size) {
array = malloc(sizeof(int) * size);
for(int i=0; i < size; i++) {
array[i] = size - i;
}
return array;
}

double record_time(int* array, int size, void (*fp)(int*, int)) {
clock_t begin = clock();
(*fp)(array, size);
clock_t end = clock();

return (double)(end - begin) / CLOCKS_PER_SEC;
}

void shell_sort(int* array, int size) {
int* h_inc;
int h_size;

h_size = floor(log(size+1)/log(2));
h_inc = malloc(sizeof(int) * h_size);
for(int i=0; i < h_size; i++) {
h_inc[i] = pow(2, i+1) - 1;
}

int i, j, tmp;

for (int r = (h_size - 1); r >= 0; r--) {
int gap = h_inc[r];

for(i = gap; i < size; i++) {
tmp = array[i];

for(j = i; j >= gap && tmp < array[j-gap]; j-=gap) {
array[j] = array[j-gap];
}
array[j] = tmp;
}
}

free(h_inc);
return;
}

int main() {
while(1) {
int size;
int* data;
double time_elapsed;

size = get_input();
if (size <= 0) { break; }

data = build_data(data, size);
time_elapsed = record_time(data, size, shell_sort);

printf("Elapsed time: %f sec\n", time_elapsed);
free(data);
}
return 0;
}

我的输出是:

Please type input size(n): 10000
Elapsed time: 0.001168 sec
Please type input size(n): 50000
Elapsed time: 0.006094 sec
Please type input size(n): 100000
Elapsed time: 0.010946 sec
Please type input size(n): 500000
Elapsed time: 0.054341 sec
Please type input size(n): 1000000
Elapsed time: 0.118640 sec
Please type input size(n): 5000000
Elapsed time: 0.618815 sec
Please type input size(n): 10000000
Elapsed time: 1.332671 sec

最佳答案

我想我们在这里比较的是不同的东西。时间复杂度和运行程序所花费的时间是不同的。时间复杂度可以简单地表示为运行时间随着输入大小趋于无穷大的渐近行为。

现在你说它是在说它遵循O(n)。我猜您正在查看两个输入并考虑时间的乘法增量。您的算法可能以 An^1.5+bn+C 周期运行。所以首先你不能比较……完全一样。您可以说,随着输入的增加,它会逐渐接近与 n^1.5 成比例的函数。

程序运行时间和复杂性之间的直接关联不是您应该寻找的。相反,您可以从程序中完成的基本操作来考虑这一点。

如果您认为我们可以完全从运行时间考虑时间复杂度,那么我想我们不必考虑那些基本操作等等。

关于c - 使用 hibbard 增量的 shell 排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46946300/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com