1.堆
1.堆结构就是用数组实现的完全二叉树结构
2.完全二叉树中如果每颗子树的最大值都在顶部就是大根堆
3.完全二叉树中如果每颗子树的最小值都在顶部就是小根堆
4.堆结构的heapInsert与heapify操作
5.堆结构的增大与减少
6.优先级队列结构,就是堆结构
二叉树:
size:7 i位置的左孩子:(i2+1) i位置的右孩子 (i 2 + 2) i的父位置:i-1/2
从0出发 由size说明是连续的几个数,就可以看成是完全二叉树。
堆操作的两个调整:heapInsert、heapify。
heapInsert代码:
public class heapInsert {public static void heapInsert(int[] arr, int index) {while (arr[index] > arr[(index-1)/2]) {sawp(arr, index, (index - 1) / 2);index = (index - 1) / 2;}}}
heapify代码:
public class heapify {public static void heapify(int[] arr, int index, int heapSize){int left = index * 2 + 1; // 左孩子的下标while(left < heapSize){ // 下方还有孩子// 两个孩子中,谁的值大,把下标给largestint largest = left + 1 < heapSize && arr[left + 1] > arr[left]? left + 1 : left;// 父和孩子之间,谁的值大,把下标给largestlargest = arr[largest] > arr[index] ? largest : index;if(largest == index){break;}swap(arr, largest, index);index = largest;left = index * 2 + 1;}}}
2.堆排序
public class heapSort {public static void heapSort(int[] arr){if(arr == null || arr.length == 2){return;}// for(int i = 0; i < arr.length; i++){// heapInsert(arr, i);// }// 如果只是单纯的将一个数组拼成大根堆用下边的算法更好for(int i = arr.length -1; i >= 0; i--){heapify(arr, i, arr.length);}int heapSize = arr.length;swap(arr, 0, --heapSize);while(heapSize > 0){heapify(arr, 0, heapSize);swap(arr, 0, --heapSize);}}public static void heapInsert(int[] arr, int index) {while (arr[index] > arr[(index-1)/2]) {swap(arr, index, (index - 1) / 2);index = (index - 1) / 2;}}public static void heapify(int[] arr, int index, int heapSize){int left = index * 2 + 1; // 左孩子的下标while(left < heapSize){ // 下方还有孩子// 两个孩子中,谁的值大,把下标给largestint largest = left + 1 < heapSize && arr[left + 1] > arr[left]? left + 1 : left;// 父和孩子之间,谁的值大,把下标给largestlargest = arr[largest] > arr[index] ? largest : index;if(largest == index){break;}swap(arr, largest, index);index = largest;left = index * 2 + 1;}}public static void swap(int[] arr, int x, int y) {int temp = arr[x];arr[x] = arr[y];arr[y] = temp;}}
