/*
归并排序
时间复杂度:O(nlog2n)
空间复杂度:O(n)
稳定性:稳定
*/
void MergeSort(int a[],int low,int high,int n){ //参数[low,high]为排序范围,包含端点的值,n为待排序数组的长度
if(low<high){
int mid = (low+high)/2;
MergeSort(a,low,mid,n); //对左路归并排序
MergeSort(a,mid+1,high,n); //对右路归并排序
Merge(a,low,mid,high,n); //对左右两路进行归并操作
}
}
/*
归并操作
a[low~mid]以及a[mid+1~high]各自有序,将其合并为一个有序表
参数n表示数组的长度
*/
void Merge(int a[],int low,int mid,int high,int n){
int i,j,k,b[n];
for(i=low;i<=high;i++){ //将待排序段复制一份
b[i] = a[i];
}
for(i=low,j=mid+1,k=low;i<=mid&&j<=high;k++){
if(b[i]<=b[j]){ //为了保证算法的稳定性故此处应设置为"<="
a[k] = b[i++];
} else {
a[k] = b[j++];
}
}
while(i<=mid){a[k++] = b[i++];}
while(j<=high){a[k++] = b[j++];}
}
C语言实现归并排序
最新推荐文章于 2024-05-23 21:17:45 发布