三路归并排序

问题描述 投票:0回答:1

我试图实现这个3路归并排序,但是这段代码不能输入超过4的大小,我一直无法找出问题所在,你能帮我吗?任何建议都会有帮助。

`#include<iostream>

void merge(int arr[],int start,int p1,int p2,int end);

void merge_sort(int arr[],int start, int end)
{
if(start>=end)
return;

if(end==start+1)
{
    if(arr[start]>arr[end])
    {
        int temp=arr[end];
        arr[end]=arr[start];
        arr[start]=temp;
    }
    return;
}

int size=end-start+1;
int p1=size/3;
int p2=2*p1;

merge_sort(arr,start,p1-1);
merge_sort(arr,p1,p2-1);
merge_sort(arr,p2,end);

merge(arr,start,p1,p2,end+1);
 }


 void merge(int arr[],int start,int p1,int p2,int end)
 {
int n=end-start;
int *temp=new int[n];

int j=start;
int k=p1;
int l=p2;
int i=0;

while(true)
{
    if(j==p1||k==p2||l==end)
    break;
    else
    if(arr[j]<arr[k]&&arr[j]<arr[l])
    {
        temp[i]=arr[j];
        j++;
    }
    else if(arr[k]<arr[j]&&arr[k]<arr[l])
    {
        temp[i]=arr[k];
        k++;
    }
    else
    {
        temp[i]=arr[l];
        l++;
    }
    i++;        
}

int r,s,limit_r,limit_s;

if(j==p1)
{
    r=k;
    s=l;
    limit_r=p2;
    limit_s=end;    
}
else if(k==p2)
{
    r=j;
    s=l;
    limit_r=p1;
    limit_s=end;
}
else if(l==end)
{
    r=j;
    s=k;
    limit_r=p1;
    limit_s=p2;
}

while(true)
{
    if(r==limit_r||s==limit_s)
    break;
    
    if(arr[r]<arr[s])
    {
        temp[i]=arr[r];
        r++;
    }
    else
    {
        temp[i]=arr[s];
        s++;
    }
    i++;
}

int final;

if(r==limit_r)
final=s;
else
final=r;

while(i<n)
{
    temp[i]=arr[final];
    final++;
    i++;
}

int test=start;

for(i=0;i<n;i++)
{
    arr[test]=temp[i];
    test++;
}

delete []temp;
return;
 }


  int main()
  {

int size;
std::cout<<"Enter the size of array:";
std::cin>>size;

int *mohit=new int[size];

std::cout<<"Enter the elements of the array:";

for(int m=0;m<size;m++)
std::cin>>mohit[m];

merge_sort(mohit,0,size-1);

std::cout<<"The final sorted array is:"<<std::endl;

for(int count=0;count<size;count++)
std::cout<<mohit[count]<<" ";

delete []mohit;

  }
 `

我尝试实现3路合并排序,但是对于较大的输入大小它失败了,我刚刚开始学习DSA,不知道在哪里发布这样的疑问,所以在这里吗?如果大家有什么解疑的平台可以推荐一下吗

c++ sorting merge
1个回答
0
投票

问题是这一行正在做整数除法:

int p1 = size / 3;

它删除了数字的浮点部分,因此它可能在某个时刻被设置为 1,这使得

p2
的值永远等于 2。

要解决此问题,您可以将

p1
更改为浮点数,并使除法返回浮点数。您还必须将
p2
设置为分区的上限:

float p1 = size / 3.0;
int p2 = ceil(2 * p1);
© www.soinside.com 2019 - 2024. All rights reserved.