自底向上的归并排序(bottom-up merge sort)

前言:

前面已经介绍了归并排序,那是普通的自顶向下的归并排序,下面就让我们来学习自底向上的归并排序。

自底向上的归并排序

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上普林斯顿大学的算法课点击打开链接

以上内容纯属个人学习总结,不代表任何团体或单位。若有理解不到之处请见谅!

猜你喜欢

转载自blog.csdn.net/qq_39747794/article/details/81951162
今日推荐