C中的合并排序实现
Mergesort implementation in C
有人可以检查我的合并排序代码吗?当我尝试对输入值进行排序时,排序后的数组包含不是来自输入的随机值。他们没有分类。
我在 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<=mid
更改为k<=hi
- 将
a[j]<a[i]
更改为aux[j]<aux[i]
有人可以检查我的合并排序代码吗?当我尝试对输入值进行排序时,排序后的数组包含不是来自输入的随机值。他们没有分类。 我在 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<=mid
更改为k<=hi
- 将
a[j]<a[i]
更改为aux[j]<aux[i]