问题描述
||
对于分配,我们将使用C编写合并排序函数:
sort(int* array,unsigned len);
我已经编写并运行了代码,但是它的运行时为O(N^2*log[N])
,无法达到合并排序的目的。效率低下的原因是合并部分如下:
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
都初始设置为零。就像我说的那样,这行之有效,只是效率低下,因为您必须转移一切。我想在排序之前将子数组分成两个临时数组,但是您可能无法创建其长度未定义为常量的数组。我还应该注意,尽管我可以使用辅助函数,但不能更改函数参数:必须有一个指向数组的指针和长度。
解决方法
您可以创建非固定长度的数组,即Google
malloc
。合并排序需要使用辅助存储器才能正常工作。完成后,必须由malloc
分配的free
内存。