/** * <ul> * <li>平均情况:O(nlog(2)n)</li> * <li>最好情况:O(nlog(2)n)</li> * <li>最坏情况:O(nlog(2)n)</li> * <li>辅助存储:O(1)</li> * <li>不稳定</li> * <ul> * * @timestamp Mar 12, 2016 6:56:54 PM * @author smallbug */ public class HeadSort { public static void main(String[] args) { int[] data = DataUtil.getData(100000); // System.out.println(Arrays.toString(data)); long time = System.currentTimeMillis(); headSort(data); // System.out.println(Arrays.toString(data)); System.out.println("speed " + (System.currentTimeMillis() - time) + " ms"); System.out.println("排序是否成功:" + (DataUtil.verify(data, DataUtil.DESC) ? "是" : "否")); } private static void headSort(int[] data) { createHead(data); for (int i = data.length - 1; i > 0; i--) { sort(data, i); } } private static void sort(int[] data, int i) { DataUtil.swap(data, 0, i); siftDown(data, i); } private static void siftDown(int[] data, int border) { int left = 2; int index = 1; int temp = data[0]; while (left < border) { if (data[left - 1] > data[left]) {// 左边大于右边,跟右边比较 if (temp > data[left]) { data[index - 1] = data[left]; index = left + 1; left = (left + 1) << 1; } else break; } else { if (temp > data[left - 1]) {// 跟左边比较 data[index - 1] = data[left - 1]; index = left; left <<= 1; } else break; } } data[index - 1] = temp; } private static void createHead(int[] data) { for (int i = 0; i < data.length; i++) { siftUp(data, i + 1); } } /** * * @timestamp Mar 12, 2016 8:32:39 PM * @param data * 数据 * @param index * 操作索引+1 */ private static void siftUp(int[] data, int index) { int temp = data[index - 1]; int parent = index >>> 1; while (parent > 0) { if (temp < data[parent - 1]) { data[index - 1] = data[parent - 1]; index = parent; parent = parent >>> 1; } else break; } data[index - 1] = temp; } }
?
原文:http://smallbug-vip.iteye.com/blog/2282438