归并排序-bottom-up(非递归版本)
由于之前讨论的归并排序时用到的是递归的方法;而递归会带来很大的开销,本节讨论由底向上的非递归版本的归并排序
思想:
对于给定的数组,设置变量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个元素的有序子序列。
}
}
}
由于之前讨论的归并排序时用到的是递归的方法;而递归会带来很大的开销,本节讨论由底向上的非递归版本的归并排序
思想:
对于给定的数组,设置变量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个元素的有序子序列。
}
}
}