归并排序-bottom-up(非递归版本)

来源:互联网 发布:电商产品 知乎 编辑:程序博客网 时间:2024/05/19 20:38

Bottom-up mergesort


由于之前讨论的归并排序时用到的是递归的方法;而递归会带来很大的开销,本节讨论由底向上的非递归版本的归并排序

思想

  • 对于给定的数组,设置变量sz为每次归并元素的个数。
  • 首先sz为1,也就是每单个元素归并(如:45和23归并成23、45),然后设置sz=sz+sz、也就是2,也就是使得数组中每两个元素归并;依次类推。

图解
这里写图片描述


代码:

package mergesort;public class MergeSort {    public static int CUTOFF = 7;    public static void main(String[] args) {        int a [] = {45,23,11,89,77,98,4,28,65,43};        sort(a);        for(int ele : a) {            System.out.println(ele);        }    }    private static void merge(int a[], int aux[], int lo, int mid, int hi) {        for(int k=lo; k<=hi; k++) {            aux[k] = a[k];        }        int i = lo;        int j = mid+1;        for(int k = lo; k<=hi; k++) {            if(i>mid) {a[k] = aux[j++];}            else if(j>hi) {a[k] = aux[i++];}            else if(aux[j] < aux[i]) {a[k] = aux[j++];}            else a[k]  = aux[i++];        }    }    private static void sort(int a[]) {//      int aux[] = new int[a.length];//      sort(a, aux, 0, a.length-1);        int N = a.length;        int aux[] = new int[N];        for(int sz=1; sz<N; sz = sz+sz) {     // sz从1开始;每次循环,sz变为两倍。            for(int lo=0; lo<N-sz; lo+=sz+sz)                merge(a, aux, lo, lo+sz-1, Math.min(lo+sz+sz-1, N-1));  // 对于每sz个子序列,合并成2*sz个元素的有序子序列。        }    }}

这里写图片描述

原创粉丝点击