【发布时间】:2011-04-14 01:32:29
【问题描述】:
对于一个赋值,我们要用C写归并排序函数:
sort(int* array, unsigned len);
我已经编写并运行了代码,但它的运行时间是O(N^2*log[N]),这违背了合并排序的目的。效率低的原因是因为merge部分如下:
while(ct1 < len1 && ct2 < len2){
if(array[0] < array[len1 - ct1]){
ct1++;
array++; // no longer look at that element
}
else{
int position = len1 - ct1;
int hold = array[position];
while(position > 0){
array[position] = array[position - 1];
position--;
}
array[0] = hold;
ct2++;
array++;
}
}
其中ct1 是左列表的计数器,ct2 是右列表的计数器,array 是指向数组的指针。 ct1 和 ct2 最初都设置为零。就像我说的,这行得通,只是效率低下,因为你必须改变一切。我想在排序之前将子数组拆分为两个临时数组,但是您应该无法创建长度未定义为常量的数组。我还应该注意,虽然我可以使用辅助函数,但我不能更改函数参数:必须有指向数组的指针和长度。
【问题讨论】:
-
你需要分配一些内存,比如说,最多原始数组的大小,用作“临时”空间来做这种事情。你可以使用动态内存分配,对吧?
-
您可以动态创建数组。例如 int tmp = (int)malloc(i*sizeof(int)).
-
取模对 malloc 的返回值进行错误转换...
-
malloc 有效,但内存分配在哪里?如果它在堆栈上,那是最好的。如果没有,你如何释放它?顺便说一句,我们得到的唯一限制是它必须是递归的,而且我们不能使用任何全局变量。可能只有班上的 5 个人知道什么是动态内存分配。我们甚至没有受到运行时限制,但我是一个完美主义者,看到某些东西比选择排序运行得慢,我很恼火。
-
nvm,知道了。谢谢大家。
标签: c algorithm variable-assignment mergesort