思维导图:
归并排序的定义:
俩个有序线性表的合并:
int *B = (int *)malloc((n+1) * sizeof(int)); //总长度存储空间,0不使用
// 初始数组、第一个组的初始元素位置、第一个组的最后元素位置、第二个组的最后元素位置
void Merge(int A[],int low,int mid,int high){
for(int k = low;k <= high;k ++)
B[k] = A[k]; //将A中元素复制到B
// i第一个组的初始元素位置、j第二个组的初始元素位置 、k存储结果的位置
for(int i = low,int j = mid+1,int k = i;i<=mid && j<=high;k++){
if(B[i] <= B[j])
A[k] = B[i++]; //将较小的复制到A
else
A[k] = B[j++];
}
//某一个组排序完成
while(i <= mid)
A[k++] = B[i++];
while(j <= high)
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);
}
}
归并排序的性能:
时间复杂度:
空间复杂度:
稳定
适用于顺序存储和链式存储