合并使用O(N * log [N])运行时在C中排序

时间:2011-04-14 01:32:29

标签: c algorithm variable-assignment mergesort

对于赋值,我们将在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是指向数组的指针。 ct1ct2都初始设置为零。就像我说的那样,这很有效,因为你必须改变一切。我想在排序之前将子数组拆分成两个临时数组,但是你可能无法创建长度未定义为常量的数组。我还应该注意,虽然我可以使用辅助函数,但我无法更改函数参数:必须有一个指向数组的指针和长度。

1 个答案:

答案 0 :(得分:2)

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