c - C中的合并排序实现

标签 c mergesort

有人可以检查我的合并排序代码吗?当我尝试对输入值进行排序时,排序后的数组包含不是来自输入的随机值。他们没有分类。 我在 while 循环中声明数组的方式是否正确?

  #include <stdio.h>
void merge (int a[], int aux[], int lo, int mid, int hi){

    for(int y=lo; y<=hi; y++){
        aux[y]=a[y];
    }
    int i=lo; 
    int j=mid+1;
    for(int k=lo;k<=mid;k++){
        if (j>hi)           a[k]=aux[i++];
        else if (i>mid)     a[k]=aux[j++];
        else if (a[j]<a[i])
        a[k]= aux[j++];
        else
        a[k]=aux[i++];
    }
return;
}


void sort (int b[],int aux[], int lo, int hi)
{ 

if(hi<=lo)
return;
int mid= lo+(hi-lo)/2;
sort(b, aux, mid+1, hi);
sort(b, aux, lo,  mid);
merge(b,aux,lo,mid,hi);
    return;
}



int main(void) {

int t,n;

long long int sum;
scanf("%d",&t);
while(t--){
    sum=0;
    scanf("%d",&n);
    int w[n];
    int m[n];
    int g[n];
    int h[n];
    for (int i=0; i<n;i++){
        scanf("%d",&m[i]);
        }


    for (int j=0; j<n;j++){
        scanf("%d",&w[j]);
}   


    sort(w,g,0,n-1);
    sort(m,h,0,n-1);

}
    return 0;
}

最佳答案

您正在比较 merge 中无意义的值函数并在进程中间停止合并。

要更正它们,请在 merge功能

  • 更改 k<=midk<=hi
  • 更改 a[j]<a[i]aux[j]<aux[i]

关于c - C中的合并排序实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33462453/

相关文章:

java - 使用合并排序(递归)按字母顺序对名称进行排序

c++ - 基于CLRS的合并排序C++上的算法简介(带反转计数)

c - C中如何释放变量占用的内存?

c - 为什么我不能传递链的地址?斯特托尔

c - ltrace 和 strace 工具中的行号信息

java - 合并排序算法中的堆栈溢出错误?

java - 归并排序通用方法

c# - 为什么在此实现中插入排序总是击败合并排序?

c - 使用 Open Watcom 内联汇编从结构指针访问结构成员

c++ - 从 C++ 调用 C DLL 会出现访问冲突,但使用 DllImport 工作的 C# 项目