2011-04-14 55 views
1

对于一个任务,我们要编写合并排序功能在C:合并排序用C与O(N *登录[N])运行

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是柜台右边的列表和数组是指针数组。最初将ct1ct2都设置为零。就像我说的那样,这样做很有效,因为你必须改变一切。我想在排序之前将子数组拆分为两个临时数组,但你应该不能创建其长度未定义为常量的数组。我还应该注意到,虽然我可以使用帮助函数,但我不能更改函数参数:必须有指向数组的指针和长度。

+0

你需要分配一些内存,比如原始数组的大小,用作“scratch”空间来做这种事情。你被允许使用动态内存分配,对吧? – 2011-04-14 01:43:24

+0

您可以动态创建阵列。例如int * tmp =(int *)malloc(i * sizeof(int))。 – sarvesh 2011-04-14 01:47:51

+0

模偏移malloc的返回值的错误转换... – 2011-04-14 01:58:25

回答

2

您可以创建非常量长度的数组,google malloc。合并排序需要使用辅助内存才能正常工作。当你完成它时,你必须freemalloc分配的内存。

+0

实际上,merge-sort不需要使用辅助内存。它可以在原地完成,即存在已知的不使用辅助存储器的算法,但是它们很难并且可能没有实际使用。 – 2011-04-14 03:39:02

相关问题