gpt4 book ai didi

c - 我的合并排序代码有什么问题

转载 作者:行者123 更新时间:2023-11-30 15:21:36 24 4
gpt4 key购买 nike

我正在学习编码,我想尝试编写一个合并排序算法(我们在分析类(class)中听说过,但不是家庭作业)。我正在根据培训师向我们展示的伪代码进行工作,但我无法识别问题。有人能指出我正确的方向吗?

#include <stdio.h>
#include <stdlib.h>
typedef int T;


void merge(T _elem[], int lo, int mi, int hi)
{
int lb = mi - lo, lc = hi - mi;


T* B = (T* )malloc(sizeof(T)*lb);

for (int i = 0; i < lb; i++) B[i] = _elem[i];


T* C = _elem + mi;


for (int i = 0, j = 0, k = 0; j < lb || k < lc;)
{
if (j < lb && (lc <= k || B[j] <= C[k])) _elem[i++] = B[j++];
if (k < lc && (lb <= j || C[k] < B[j])) _elem[i++] = C[k++];
}
free(B);
}

void mergeSort(T _elem[], int lo, int hi)
{
if (hi - lo < 2) return;
int mi = (lo + hi) >> 1;
mergeSort(_elem, lo, mi);
mergeSort(_elem, mi, hi);
merge(_elem, lo, mi, hi);
}

int main()
{
T elem[19] = {53, 130, 120, 14, 206, 31, 380, 39, 402, 146, 491, 51, 54, 59, 722, 79, 82, 186, 92};
mergeSort(elem, 0, 19);
for (int i = 0; i < 19; i++)
printf("%d\t", elem[i]);
return 0;
}

最佳答案

我发现这段代码有 3 个明显的问题,但请记住,我只是在出去的时候读过它,没有调试器。您应该调试它并查看。

  • 您的 mergeSort() 调用的范围重叠。没有理由对中间元素进行两次排序,而且您希望尽快删除元素并最终得到一个空集。
  • 当您填充 B 临时数组时,您没有正确索引 _elem,您应该通过 i+lo 进行偏移。
  • 与上面相同,合并时您没有正确索引_elem。您应该使用 lo 初始化 i,而不是一直从头开始。

关于c - 我的合并排序代码有什么问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29539170/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com