归并排序与其他交换排序和选择排序不一样,是将两个或两个以上的有序表合并为一个新的有序表;
以下是其C语言代码:
void Merge(int A[], int low, int mid, int high)
{
int i,j,k;
int *B = ( int*)malloc((high-low+1)*sizeof(int));
for(int 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]) //比较B中左右两段的元素;
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)
{
int mid = (low+high)/2; //从中间划分两个子序列;
MergeSort(A,low,mid); //对左侧子序列进行递归排序;
MergeSort(A,mid+1;high); //从右侧子序列进行递归排序;
Merge(A,low,mid,high); //归并;
}
每趟归并排序时间复杂度为O(n),所以总的时间复杂度为O(n*log2 n),空间复杂度为O(n);