c - 合并排序在 C 与 O(N*log[N]) 运行时

标签 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 初始设置为零。就像我说的,这行得通,只是效率低下,因为你必须改变一切。我想在排序之前将子数组拆分为两个临时数组,但你不能创建长度未定义为常量的数组。我还应该注意,虽然我可以使用辅助函数,但我不能更改函数参数:必须有一个指向数组的指针和长度。

最佳答案

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

关于c - 合并排序在 C 与 O(N*log[N]) 运行时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5657620/

相关文章:

algorithm - 从两种不同的方式删除二叉搜索树中的节点,哪种方式更可靠?

delphi - 使用查询组件“无法将类型(Null)的变体转换为类型(OleStr)”,以提取数据供以后使用

python - Python 中二维矩阵的单元分配,没有 numpy

遍历目录时的 C 编程段错误

c - 如何将客户端和服务器链接到同一个信号量

c - 相同的绑定(bind)端口 UDP 套接字并在所有套接字上接收数据

递归函数中的 Python yield 语句问题?

c - 在 C 中运行时之前定义结构成员

algorithm - 查找从一个图节点到另一个图节点的所有路径的逻辑

java - 代码无法编译,因为最终变量 "might"(但不能)被分配两次?