二路归并的实现
1、递归实现
const int maxn = 100;
//将数组A的[L1, R1]与[L1, R2]区间合并为有序区间(此处L2即为R1 + 1)
void merge(int A[], int L1, int R1, int L2, int R2) {
int i = L1, j = L2;
int temp[maxn], index = 0;
while(i <= R1 && j <= R2){
if(A[i] <= A[j]) {
temp[index++] = A[i++];//将A[i]加入序列temp
} else {
temp[index++] = A[j++];//将A[j]加入序列temp
}
}
while(i <= R1) temp[index++] = A[i++];//将剩余元素加入队列
while(j <= R2) temp[index++] = A[j++];
for(i = 0; i < index; i++){
A[L1 + i] = temp[i];//合并后的序列赋值给A数组
}
}
void mergeSort(int A[], int left, int right) {
if(left < right){ //只要left 小于right
int mid = (left + right) / 2;//取中间点
mergeSort(A, left, mid);//递归,左边子区间排序
mergeSort(A, mid + 1, right);//递归,右边子区间排序
merge(A, left, mid, mid + 1, right);//合并
}
}
2、非递归实现
void mergeSort(int A[]){
for(int step = 2; step / 2 <= n; step *= 2){
//每step个元素一组
for(int i = 1; i <= n; i += step){
int mid = i + step / 2 - 1;
if(mid + 1 <= n) {
merge(A, i, mid, mid + 1, min(i + step - 1, n));
}
}
}
}