前言
前面已经介绍了归并排序,那是普通的自顶向下的归并排序,下面就让我们来学习自底向上的归并排序。
自底向上的归并排序
1. 首先将数列划分成微小的数列,每个数列也就一到两个元素。
2. 不断合并,2,4,8.。。。
基本排序轨迹图:
来看看c++代码:
void merge(int *a, int *aux, int lo, int mid, int hi){
int k;
for(k = 0; k <= hi; k++){
aux[k] = a[k];
}
int i = lo, j = mid + 1;
for(k = lo; k <= hi; k++){
if(i > mid){
a[k] = aux[j];
j = j + 1;
}
else{
if(j > hi){
a[k] = aux[i];
i = i + 1;
}
else{
if(aux[j] < aux[i]){
a[k] = aux[j];
j = j + 1;
}
else{
a[k] = aux[i];
i = i + 1;
}
}
}
}
}
void sort(int *a){
int lo, N = 10;
int aux[10];
int sz;
for(sz = 1; sz < N; sz = sz + 1){
for(lo = 0; lo < N - sz; lo = lo + sz + sz){
merge(a, aux, lo, lo + sz - 1, min(lo+sz+sz-1, N-1));
}
}
}
运行一下:
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
int i;
int a[10] = {5, 7, 4, 3, 6, 9, 0, 1, 2, 8};
int aux[10];
sort(a, aux, 0, 9);
for(i = 0; i < 10; i++){
cout << a[i] << " ";
}
cout << endl;
}
总结
自底向上的排序主要是先局部排序,然后慢慢扩大,逐步扩大到全局排序。自我感觉,递归的归并排序就是从上往下先拆分,然后不断递归合并回去了,而这种自底向上的就直接从拆分的往上走,不递归,只迭代。
最后强烈推荐Coursera上普林斯顿大学的算法课点击打开链接
以上内容纯属个人学习总结,不代表任何团体或单位。若有理解不到之处请见谅!