算法思想:把两个或多有序子序列合并成为一个,通常为2路归并,或者k路归并。
性能:空间复杂度O(n),时间复杂度O(nlogn),稳定算法。所要比的趟数等于“log2^n向上取整”。
归并排序
//归并
int* B = new int[Max];//辅助队列
void Merge(int A[],int low,int mid,int high)
{
//A[low...mid]与A[mid+1...high]各自有序,将两个归并
int i, j, k;
for (k = low; k <= high; k++) B[k] = A[k];//将A中所有元素复制到B中
for (i = low, j = mid + 1, k = i; i <= mid && j <= high; k++)
{
if (B[i] <= B[j])
A[k] = B[i++];
else
A[k] = B[j++];
}//将较小的元素复制到A中
while (i <= mid)A[k++] = B[i++];
while (j <= mid)A[k++] = B[j++];
}
//归并排序
void MergeSort(int A[], int low, int high)
{
if (low < high)
{
int mid = (low + high) / 2;//从中间划分
MergeSort(A, low, mid);//对右半部分归并排序
MergeSort(A, mid + 1, high);//对右半部分归并排序
Merge(A, low, mid, high);//归并
}
}
若low<high,则将序列从中间mid=(low+high)/2分开,对左半部分[low,mid]递归地进行归并排序,对右半部分[mid+1,high]递归地进行归并排序。将左右两个有序子序列Merge为一个。
全部代码
//归并
int* B = new int[Max];//辅助队列
void Merge(int A[],int low,int mid,int high)
{
//A[low...mid]与A[mid+1...high]各自有序,将两个归并
int i, j, k;
for (k = low; k <= high; k++) B[k] = A[k];//将A中所有元素复制到B中
for (i = low, j = mid + 1, k = i; i <= mid && j <= high; k++)
{
if (B[i] <= B[j])
A[k] = B[i++];
else
A[k] = B[j++];
}//将较小的元素复制到A中
while (i <= mid)A[k++] = B[i++];
while (j <= mid)A[k++] = B[j++];
}
//归并排序
void MergeSort(int A[], int low, int high)
{
if (low < high)
{
int mid = (low + high) / 2;//从中间划分
MergeSort(A, low, mid);//对右半部分归并排序
MergeSort(A, mid + 1, high);//对右半部分归并排序
Merge(A, low, mid, high);//归并
}
}
int main()
{
int A[Max] = { 49,38,65,97,76,13,27 };
int i, j;
printf("初始序列为:");
for (i = 0; i < Max; i++)
{
printf("%d ", A[i]);
}
printf("\n");
printf("进行归并排序:");
MergeSort(A, 0, Max-1);
printf("排序之后:");
for (i = 0; i < Max; i++)
{
printf("%d ", A[i]);
}
printf("\n");
return 1;
}
至此