思路
1. 分解(将一个数组拆分成两个数组)
2. 合并(将两个有序的数组合并成一个有序的数组,借助一个辅助数组)
代码
#include <stdio.h>
// 将arr[l...mid]和arr[mid+1...r]两部分进行归并
void __merge(int arr[], int l, int mid, int r){
// 经测试,传递aux数组的性能效果并不好
int aux[r-l+1];//设置辅助数组
for( int i = l ; i <= r; i ++ ){
aux[i-l] = arr[i];
}
int i = l, j = mid+1;
//将辅助数组中拆分的两部分有序的插入原数组中
for( int k = l ; k <= r; k ++ ){
if( i > mid ){
arr[k] = aux[j-l]; j ++;
}else if( j > r ){
arr[k] = aux[i-l]; i ++;
}else if( aux[i-l] < aux[j-l] ){
arr[k] = aux[i-l]; i ++;
}else{
arr[k] = aux[j-l]; j ++;
}
}
}
// 递归使用归并排序,对arr[l...r]的范围进行排序
void __mergeSort(int arr[], int l, int r){
if( l >= r ){//不能再次拆分则直接返回
return;
}
//能继续拆分进行拆分
//int mid = (l+r)/2;
int mid = l+(r-l)/2; //这样比上面的写法更好
__mergeSort(arr, l, mid);
__mergeSort(arr, mid+1, r);
//进行合并
__merge(arr, l, mid, r);
}
void mergeSort(int arr[], int n){
__mergeSort( arr , 0 , n-1 );
}
int main() {
int arr[10] = {2,4,8,6,5,7,3,9,1,0};
mergeSort(arr, 10);
for (int i=0; i<10; i++) {
printf("%d\n",arr[i]);
}
return 0;
}