//原地归并排序不需要辅助数组即可归并。关键在于merge这个函数。
#include<iostream>
using namespace std;
void reverse(int *data,int n)
{
for(int i=0;i<n/2;i++)
{
swap(data[i],data[n-i-1]);
}
}
//将含有n个元素的E数组向左循环移位i个位置
void exchange(int *data,int n,int i)
{
reverse(data,i);
reverse(data+i,n-i);
reverse(data,n);
}
void merge(int *data,int start,int mid,int end)
{
int i=start;
int j=mid;
int k=end;
while(i<j&&j<=k)
{
int step=0;
while(i<j && data[i]<=data[j])
++i;
while(j<=k && data[i]>=data[j])
{
++j;
++step;
}
//data+i为子数组的首地址,j-i为子数组元素的个数,j-i-step为左循环移位的个数
exchange(data+i,j-i,j-i-step);
i=i+step;//下一个比较的元素
}
for(int i=0;i<10;i++)
cout<<data[i]<<" ";
cout<<"\n"<<endl;
}
void MergeSort(int *data,int start,int end)
{
if(start<end)
{
int mid=(start+end)/2;
MergeSort(data,start,mid);
MergeSort(data,mid+1,end);
merge(data,start,mid+1,end);
}
}
void main()
{
int data[]={6,4,3,1,7,8,2,9,5,0};
int len=sizeof(data)/sizeof(int);
MergeSort(data,0,len-1);
for(int i=0;i<len;i++)
cout<<data[i]<<" ";
cout<<endl;
}
原路归并排序
最新推荐文章于 2024-01-26 14:58:27 发布