归并排序:两个或多个有序表合并成一个有序表。
时间复杂度 O(nlogn)\ O(nlogn) O(nlogn)
空间复杂度 O(n)\ O(n) O(n)
//归并排序
void MergeSort (int a[], int low, int high )
{
if ( low>=high ) return;
else {
int mid = (low+high)/2;
MergeSort ( a, low, mid );
MergeSort ( a, mid+1, high );
Merge ( a, low, mid, high );
}
}
//自底向上的归并排序
void MergeSort2 (int a[], int n)
{
int t=1;
int s=t;
while ( t<n ) {
s = t;
t = s*2;
int i=0;
for (i=0; i+t<=n; i+=t )
Merge( a, i, i+s-1, i+t-1 );
if (i+s<n )
Merge( a, i, i+s-1, n-1 );
}
}
void Merge (int a[], int low, int mid, int high )
{
// 归并到 b[]
int b[high-low+1];
int i = low,j = mid+1;
int k = 0;
while ( i<=mid and j<=high ) {
if ( a[i]<=a[j] ) {
b[k] = a[i];
i++;
}
else {
b[k] = a[j];
j++;
}
k++;
}
// 归并剩余元素
while ( i<=mid ) b[k++] = a[i++];
while ( j<=high ) b[k++] = a[j++];
j=0;
for(i=low;i<=high;){
a[i++]=b[j++];
}
}