[英]Recursion in MergeSort
我編輯了代碼,刪除了明顯的錯誤。 但我仍然找不到為什么我的mergesplit函數不遞歸的原因。 它只執行一次。 請有人可以給我詳細的解決方案。
#include<bits/stdc++.h>
void Merge_Sort(int a[],int p,int q,int mid);
void Merge_Split(int a[],int p,int q)//recursive function
{
int mid;
if (p<q)
{
mid=(p+q)/2;
Merge_Split(a,p,mid);
Merge_Split(a,mid+1,q);
Merge_Sort(a,p,q,mid);
}
return;
}
void Merge_Sort(int a[], int p,int q,int mid)//sorting function
{
int b[50];
int i,j,x;
for(i=p,j=mid+1,x=p;i<=mid,j<q;)
{
if(a[j]<=a[i])
b[x++]=a[j++];
else
b[x++]=a[i++];
}
while(i<=mid)
{
b[x++]=a[i++];
}
while(j<=q)
{
b[x++]=a[j++];
}
for(int i=p;i<q;i++)
a[i]=b[i];
}
int main()
{
int a[5],x=0,n=5;
for(int i=0;i<n;i++)
scanf("%d", &a[i]);
Merge_Split(a,0,5);
for(int i=0;i<5;i++)
printf("%d", a[i]);
return 0;
}
此代碼應該可以正常工作。 我找不到我的問題。 請幫助。
您搞砸了打開/關閉間隔。 一旦確定了間隔類型,就可以使代碼與約定保持一致。
Merge_Split(a,0,5)
表示您要使用左關閉,右打開間隔。
在這種情況下:
if (p<q)
Merge_Split(a,p,mid);
Merge_Split(a,mid,q);
Merge_Sort(a,p,q,mid);
和:
for(i=p,j=mid,x=p;i<mid,j<q;)
while(i<mid)
帶有這些更改的完整代碼:
#include<bits/stdc++.h>
void Merge_Sort(int a[],int p,int q,int mid);
void Merge_Split(int a[],int p,int q)//recursive function
{
int mid;
if (p<q - 1)
{
mid=(p+q)/2;
Merge_Split(a,p,mid);
Merge_Split(a,mid,q);
Merge_Sort(a,p,q,mid);
}
return;
}
void Merge_Sort(int a[], int p,int q,int mid)//sorting function
{
int b[50];
int i,j,x;
for(i=p,j=mid,x=p;i<mid,j<q;)
{
if(a[j]<=a[i])
b[x++]=a[j++];
else
b[x++]=a[i++];
}
while(i<mid)
{
b[x++]=a[i++];
}
while(j<q)
{
b[x++]=a[j++];
}
for(int i=p;i<q;i++)
a[i]=b[i];
}
int main()
{
int a[5],x=0,n=5;
for(int i=0;i<n;i++)
scanf("%d", &a[i]);
Merge_Split(a,0,5);
for(int i=0;i<5;i++)
printf("%d", a[i]);
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.