【发布时间】:2017-10-28 02:05:20
【问题描述】:
我生成了一个未排序的值数组,我想将其按升序排列并确定最后一个数字的新位置。
我之前曾在其他较小的输入上成功尝试过,但被困在列表包含 1824300 个值的最后一个输入上,并且终端根本不会运行排序算法...
#include <stdio.h>
int main(void)
{
signed value = 16239, num = 1824300, i, j;
signed temp;
signed arr[num];
arr[0] = value;
printf("Your initial array is:\n");
printf("%i\n", arr[0]);
for (i = 1; i < num; i++)
{
value = (value*31334)%31337;
arr[i]= value;
printf("%i: ", i);
printf("%i\n", arr[i]);
}
// Insertion sort
for(i = 1; i < num; i++)
{
j = i;
temp = arr[j];
while((j > 0) && (arr[j - 1] > temp))
{
arr[j] = arr[j -1];
arr[j - 1] = temp;
j--;
}
}
insertion sort //
printf("Your sorted array is:\n");
for(i = 0; i < num; i++)
{
printf("%i: ", i);
printf("%i\n", arr[i]);
}
return 0;
}
有人可以帮我吗? 附言我对编程完全陌生,所以我的代码可能非常低效和混乱,对此感到抱歉! 非常感谢!!!
【问题讨论】:
-
最坏情况下的插入排序是
O(n^2)算法。有近 200 万个条目,您可能已经耗尽了系统的资源。 -
你应该看看更有效的排序算法。插入排序以 O(n^2) 运行,这意味着对于大小为 n 的输入数组,它需要 n^2 次比较。一个更好的算法例如是在 O(n log n) 中运行的快速排序。
-
合并排序在概念上非常简单,而且比您在这里所做的要高效得多。使用 2M 条目,递归深度将在 20 多度,当然没有问题。不管你最终排序,一旦完成,搜索你喜欢的元素:即使是线性搜索也比最快的基于比较的排序方法更好。当然,使用排序列表,您可以根据需要进行二进制搜索,但何必费心。
-
或者,您可以调用内置的
qsort函数。见tutorialspoint.com/c_standard_library/c_function_qsort.htm -
排序如何“卡住”?是停止了,等待记忆吗?是不是太慢了?您可以使用一两个战略性放置的
print语句来跟踪进度。此外,更有效的排序算法很容易在线搜索。请阅读并遵循帮助文档中的发布指南。 on topic 和 how to ask 在这里申请。