归并排序的思考
#include <iostream>
void Merge(int r[], int r1[], int s, int m, int t); //函数声明
void MergeSort(int r[], int r1[], int s, int t);
void main()
{
int a[6], a1[6];
int i;
for(i=0; i<6; i++)
scanf("%d", &a[i]);
MergeSort(a, a1, 0, 5);
for(i=0; i<6; i++)
printf("%d ", a[i]);
printf("\n");
for(i=0; i<6; i++)
printf("%d ", a1[i]);
printf("\n");
}
void MergeSort(int r[], int r1[], int s, int t)
{
int m;
if(s==t) r1[s]=r[s];
else
{
m=(s+t)/2;
MergeSort(r, r1, s, m); //归并排序前半个子序列
MergeSort(r, r1, m+1, t); //归并排序后半个子序列
Merge(r1, r, s, m, t); //合并两个已排序的子序列
}
}
void Merge(int r[], int r1[], int s, int m, int t) //合并两个已排序的子序列函数
{
int i=s, j=m+1, k=s;
while(i<=m && j<=t)
{
if(r[i]<=r[j]) r1[k++]=r[i++]; //取r[i]和r[j]中的较小者放入r[k];
else r1[k++]=r[j++];
}
if(i<=m) //若第一个子序列没处理完,则进行收尾处理
while(i<=m)
r1[k++]=r[i++];
else //若第二个子序列没处理完,则进行收尾处理
while(j<=t)
r1[k++]=r[j++];
//注意:无下面词语,不能完成正确排序
/***************************************************************************************
*原因:从最深层递归开始(递归进行到只有一个元素时)返回调用Merge函数,但把已排序的结果 *
*放入r1数组中,r数组中的元素为无序,导致后面每次调用Merge函数都一样,不能正确排序。 *
***************************************************************************************/
for(i=s; i<=t; i++)
r[i]=r1[i];
}