归并排序运行结果错误
代码如下
请帮忙看一下
#include
using namespace std;
void Merge_sort(int a[],int q,int p,int temp[]);
void Merge(int a[],int q,int s,int p,int temp[]);
int main()
{
int a[10]={4,32,8,12,53,9,3,7,2,17};
int b[10];
int x=sizeof(a)/sizeof(int);
Merge_sort(a,0,x-1,b);
for(int i=0;i[i]<<" , ";
return 0;
}
void Merge_sort(int a[],int q,int p,int temp[])
{
if(qint s=q+(p-q)/2;
Merge_sort(a,q,s,temp);
Merge_sort(a,s+1,p,temp);
Merge(a,q,s,p,temp);
}
}
void Merge(int a[],int q,int s,int p,int temp[])
{
int pb=0;
int p1=q,p2=s+1;
while(p1<=s&&p2<=p)
{
if(a[p1][p2])
temp[pb++]=a[p1++];
else
temp[pb++]=a[p2++];
}
while(p1<=s)
temp[pb++]=a[p1++];
while(p2[pb++]=a[p2++];
for(int i=0;i1;i++)
a[s+i]=temp[i];
}
目测 while 循环条件改为 p2<=p
在 Merge 函数的最后一个 while 循环中,应该将条件改成 p2<=p,因为右半部分的最后一个元素下标是 p-1,而不是 p。我给你修改一下:
void Merge(int a[], int q, int s, int p, int temp[]) {
int pb = 0;
int p1 = q, p2 = s + 1;
while (p1 <= s && p2 <= p) {
if (a[p1] < a[p2])
temp[pb++] = a[p1++];
else
temp[pb++] = a[p2++];
}
while (p1 <= s)
temp[pb++] = a[p1++];
while (p2 <= p)
temp[pb++] = a[p2++];
for (int i = 0; i < p - q + 1; i++)
a[q + i] = temp[i];
}
此外,建议在编写代码时注意变量名的语义,例如 pb、p1 和 p2 可以使用更有意义的名称,让代码更加易读和易懂,你这种写法后期不好维护