/**
* 树形选择排序 --元素要2^n个,不够补,如无穷大
*
* @param a
*/
public static void treeSelectionSort(int[] a) {
int n = (int) (Math.log(a.length) / Math.log(2)) + 1;
int[][] b = new int[n + 1][];
for (int i = 0; i <= n; i++) { //初始化最后一层
b[i] = new int[(int) Math.pow(2, i)];
}
for (int i = 0; i < a.length; i++) {
b[n][i] = a[i];
}
for (int i = a.length; i < (int) Math.pow(2, n); i++) {
b[n][i] = Integer.MAX_VALUE;
}
//排序
for(int k=0;k<a.length;k++){
for (int i = n - 1; i >= 0; i--) { //生成树
for (int j = 0; j < (int) Math.pow(2, i); j++) {
if (b[i + 1][2 * j] <= b[i + 1][2 * j + 1]) {
b[i][j] = b[i + 1][2 * j];
} else {
b[i][j] = b[i + 1][2 * j + 1];
}
}
}
a[k] = b[0][0];
int parent=0;
for(int i=1;i<=n;i++){ //调整树
if(b[i][parent*2]==b[0][0]){
b[i][parent*2]=Integer.MAX_VALUE;
parent = parent*2;
}else if(b[i][parent*2+1] == b[0][0]){
b[i][parent*2+1]=Integer.MAX_VALUE;
parent = parent*2+1;
}
}
}
}
树形选择排序
最新推荐文章于 2020-04-21 21:26:43 发布