自己想找找归并排序怎么实现的,结果在网上居然没找到一个能用的归并排序的算法,经过自己的琢磨,现在写出了下面的算法。
void MergeArray(int *a,int first,int middle,int last)
{
int n1 = middle-first;
int n2 = last - middle-1;//注意此处的长度
int *L = new int[n1+1];
int *R = new int[n2+1];
int i , j ,k;
for(i = 0;i<=n1;i++)
L[i] = a[first+i];
for(j = 0;j<=n2;j++)
R[j] = a[middle+j+1];
k = 0,i=0,j=0;
while(i<=n1 &&j<=n2)
{
if(L[i]<R[j])
a[first+i+j] = L[i++];
else
a[first+i+j] = R[j++];
}
while(i<=n1)
{
a[first+i+j] = L[i++];
}
while(j<=n2)
{
a[first+i+j] = R[j++];
}
delete []L;
delete []R;
}
void mergesort(int *a, int first, int last)
{
if(first>=last)
return;
if(first<last)
{
int mid = (first + last) / 2;
mergesort(a, first, mid); //左边有序
mergesort(a, mid + 1, last); //右边有序
MergeArray(a, first, mid, last); //再将二个有序数列合并
}
}
void MergeSort(int *a, int n)
{
mergesort(a,0,n-1);
}
void PrintArray(int *b)
{
for(int i = 0;i<10;i++)
{
cout<<b[i]<<" ";
}
cout<<endl;
}
int main()
{
int a[10];
for(int k = 0;k<5;k++)
{
for(int i = 0;i<10;i++)
{
a[i] = rand()%100;
}
cout<<"排序前:";
PrintArray(a);
//QSort(a,0,9);
MergeSort(a,10);
cout<<"排序后:";
PrintArray(a);
cout<<endl;
}
return 0;
}