View Code
/** * TODO 折半查找,二叉树与后序遍历,堆排序 * */ import java.util.Arrays; import java.util.Random; public class search { public static int discount(Integer[] data, int t) { int low = 0; int high = data.length - 1; while (low <= high) { int mid = (low + high) / 2; if (t < data[mid]) { high = mid - 1; } else if (t > data[mid]) { low = mid + 1; } else { return mid; } } return -1; } public static class BiTree<T extends Comparable<T>> { T data; BiTree<T> rChild, lChild; public BiTree(T data) { super(); this.data = data; } public T getData() { return data; } public void setData(T data) { this.data = data; } public BiTree<T> getrChild() { return rChild; } public void setrChild(BiTree<T> rChild) { this.rChild = rChild; } public BiTree<T> getlChild() { return lChild; } public void setlChild(BiTree<T> lChild) { this.lChild = lChild; } public void insertChild(BiTree<T> c) { if (c.getData().compareTo(data) < 0) { if (rChild == null) { rChild = c; return; } rChild.insertChild(c); } else { if (lChild == null) { lChild = c; return; } lChild.insertChild(c); } } /** * 后序遍历输出 */ @Override public String toString() { // TODO Auto-generated method stub StringBuilder sb = new StringBuilder(); if (rChild != null) { sb.append(rChild.toString()); } sb.append(data).append(","); if (lChild != null) { sb.append(lChild.toString()); } return sb.toString(); } } public static <T extends Comparable<T>> void createBiTree(T[] data) { BiTree<T> root = new BiTree<T>(data[0]); for (int i = 1; i < data.length; i++) { root.insertChild(new BiTree<T>(data[i])); } System.out.println(Arrays.toString(root.toString().split(","))); } /** * 小顶堆 * * @param data */ public static <T extends Comparable<T>> void heapAdjust(T data[], int start) { if (start * 2 > data.length - 1) { return; } for (int i = start; i > 0; i--) { if (i * 2 + 1 <= data.length - 1) { int r = 0; if (data[i * 2].compareTo(data[i * 2 + 1]) <= 0) { if (data[i].compareTo(data[i * 2]) > 0) { T tmpT = data[i * 2]; data[i * 2] = data[i]; data[i] = tmpT; r = 1; } } else if (data[i * 2].compareTo(data[i * 2 + 1]) > 0) { if (data[i].compareTo(data[i * 2 + 1]) > 0) { T tmpT = data[i * 2 + 1]; data[i * 2 + 1] = data[i]; data[i] = tmpT; r = -1; } } if (r == 1) { heapAdjust(data, i * 2); } else if (r == -1) { heapAdjust(data, i * 2 + 1); } } else { if (data[i].compareTo(data[i * 2]) > 0) { T tmpT = data[i * 2]; data[i * 2] = data[i]; data[i] = tmpT; } } } } public static <T extends Comparable<T>> void heapSort(T data[]) { // Integer[] data = new Integer[data2.length + 1]; // System.arraycopy(data2, 0, data, 1, data2.length); // int res[] = new int[data.length - 1]; T res[] = Arrays.copyOf(data, data.length); for (int i = 1; i < res.length; i++) { heapAdjust(data, (data.length - 1) / 2); res[i] = data[1]; data[1] = data[data.length - 1]; data = Arrays.copyOf(data, data.length - 1); } System.out.println(Arrays.toString(res)); } public static void main(String args[]) { Double[] data = new Double[12]; for (int j = 0; j < 10; j++) { Random random = new Random(System.currentTimeMillis()); data = new Double[10]; for (int i = 0; i < data.length; i++) { data[i] = Math.abs(random.nextDouble() % 10); } System.out.println(Arrays.toString(data)); createBiTree(data); Double[] data2 = new Double[data.length + 1]; System.arraycopy(data, 0, data2, 1, data.length); heapSort(data2); } } }