package com.bao.sort; import com.bao.sort.SortUtil.Sort; public class TreeSort implements Sort { @Override public void sort(int[] data) { int[] ret = TreeSelectionSort(data); System.arraycopy(data, 0, ret, 0, data.length); } //http://baike.baidu.com/view/3108940.htm public static int[] TreeSelectionSort(int[] mData) { int TreeLong = mData.length * 4; int MinValue = -10000; int[] tree = new int[TreeLong]; // 树的大小 int baseSize; int i; int n = mData.length; int max; int maxIndex; int treeSize; baseSize = 1; while(baseSize < n) { baseSize *= 2; } treeSize = baseSize * 2 - 1; for(i = 0; i < n; i++) { tree[treeSize - i] = mData[i]; } for(; i < baseSize; i++) { tree[treeSize - i] = MinValue; } // 构造一棵树 for(i = treeSize; i > 1; i -= 2) { tree[i / 2] = (tree[i] > tree[i - 1] ? tree[i] : tree[i - 1]); } n -= 1; while(n != -1) { max = tree[1]; mData[n--] = max; maxIndex = treeSize; while(tree[maxIndex] != max) { maxIndex--; } tree[maxIndex] = MinValue; while(maxIndex > 1) { if(maxIndex % 2 == 0) { tree[maxIndex / 2] = (tree[maxIndex] > tree[maxIndex + 1] ? tree[maxIndex] : tree[maxIndex + 1]); } else { tree[maxIndex / 2] = (tree[maxIndex] > tree[maxIndex - 1] ? tree[maxIndex] : tree[maxIndex - 1]); } maxIndex /= 2; } } return mData; } }