归并排序思想
多次将两个或两个以上的有序表合并成一个新的有序表。 最简单的
归并:是直接将两个有序的子表合并成一个有序的表。
//归并排序
//2-路归并实现
void Merge(int R[], int low, int mid, int high)
{
int *R1;
int i = low, j = mid + 1, k = 0;//i,j,k分别为如图所示三部分的开头
R1 = (int *)malloc((high - low + 1) * sizeof(int));//动态分配空间R1,用于保存合并的结果
while (i <= mid&&j <= high)//两段均未扫描完时合并
{
if (R[i] <= R[j])
{
R1[k] = R[i];
i++;
k++;
}
else
{
R1[k] = R[j];
j++;
k++;
}
}
//将第1段余下的部分复制到R1
while (i<=mid)
{
R1[k] = R[i];
i++;
k++;
}
//将第2段余下的部分复制到R1
while (j <= high)
{
R1[k] = R[j];
j++;
k++;
}
//将合并后的结果复制回R
for (k = 0, i = low; i <= high; k++,i++)
{
R[i] = R1[k];
}
}
//实现一趟归并MergePass()及合并排序MergeSort()的实现
void MergePass(int R[], int length, int n)
{
int i;
for (i = 0; i + 2 * length - 1 < n; i = i + 2 * length)
Merge(R, i, i + length - 1, i + 2 * length - 1);
if (i + length - 1 < n)
Merge(R, i, i + length - 1, n - 1);
}
void MergeSort(int R[], int n)
{
int length;
for (length = 1; length < n; length = 2 * length)
MergePass(R, length, n);
}
void main()
{
int a[] = { 18 ,2,20,34,12,32,6,16,1,5 };
int n = sizeof(a) / sizeof(int);
MergeSort(a, n);
for (int i = 0; i < n; i++)
{
cout << a[i] << " ";
}
}