簡體   English   中英

MergeSort中的遞歸

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM