【问题标题】:Merge Sort in C with O(N*log[N]) Runtime使用 O(N*log[N]) 运行时在 C 中合并排序
【发布时间】: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 是指向数组的指针。 ct1ct2 最初都设置为零。就像我说的,这行得通,只是效率低下,因为你必须改变一切。我想在排序之前将子数组拆分为两个临时数组,但是您应该无法创建长度未定义为常量的数组。我还应该注意,虽然我可以使用辅助函数,但我不能更改函数参数:必须有指向数组的指针和长度。

【问题讨论】:

  • 你需要分配一些内存,比如说,最多原始数组的大小,用作“临时”空间来做这种事情。你可以使用动态内存分配,对吧?
  • 您可以动态创建数组。例如 int tmp = (int)malloc(i*sizeof(int)).
  • 取模对 malloc 的返回值进行错误转换...
  • malloc 有效,但内存分配在哪里?如果它在堆栈上,那是最好的。如果没有,你如何释放它?顺便说一句,我们得到的唯一限制是它必须是递归的,而且我们不能使用任何全局变量。可能只有班上的 5 个人知道什么是动态内存分配。我们甚至没有受到运行时限制,但我是一个完美主义者,看到某些东西比选择排序运行得慢,我很恼火。
  • nvm,知道了。谢谢大家。

标签: c algorithm variable-assignment mergesort


【解决方案1】:

您可以创建非恒定长度的数组,google malloc。合并排序需要使用辅助内存才能正常工作。完成后,您必须通过malloc 分配free 内存。

【讨论】:

  • 实际上合并排序并不要求使用辅助内存。它可以就地完成,即有一些已知的算法不使用辅助内存,但它们很难并且可能没有实际用途。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-19
  • 1970-01-01
  • 2011-12-09
  • 1970-01-01
  • 1970-01-01
  • 2019-11-19
  • 2011-12-12
相关资源
最近更新 更多