首页 > 代码库 > 堆排序
堆排序
1 package Sort; 2 3 import org.junit.Test; 4 5 public class HeapSort { 6 7 // 交换数组中的两个元素 8 public void exchange(int[] array, int index1, int index2) { 9 int tmp = array[index1];10 array[index1] = array[index2];11 array[index2] = tmp;12 }13 14 /**15 * 功能 保证index索引后的元素都满足最大堆的性质16 * 17 * @param array18 * 一个无序的数组19 * @param index20 * 数组的一个下标21 * @parem heapSize 真正有效的堆元素数量22 */23 public void MaxHeapify(int[] array, int index, int heapSize) {24 25 // 假设根节点为array[left],array[right]满足最大堆的性质26 int left = 2 * index;27 int right = left + 1;28 int largest = index;29 // largest用来指向最大元素的下标30 if (left <= heapSize && array[left] > array[index])31 largest = left;32 if (right <= heapSize && array[right] > array[largest])33 largest = right;34 if (largest != index) {35 exchange(array, largest, index);36 MaxHeapify(array, largest, heapSize);37 }38 }39 40 // 构建最大堆,注意下标从1开始,类似于完全二叉树41 public void BuildMaxHeap(int[] array) {42 43 // 不考虑array[0]44 int i = (array.length - 1) / 2;45 while (i >= 1) {46 // 此时堆中有效的元素是数组的长度-1个47 MaxHeapify(array, i, array.length - 1);48 --i;49 }50 }51 52 // 真正的堆排序算法要开始了53 public void heapSort(int[] array) {54 int heapSize = array.length - 1;55 BuildMaxHeap(array);56 for (int i = array.length - 1; i > 1; --i) {57 exchange(array, 1, i);58 MaxHeapify(array, 1, --heapSize);59 }60 }61 62 // 返回数组中的最大元素,并从数组中删除它63 // 返回优先队列中优先级最高的元素,出队64 // 实际上出队的过程只是把元素拿到了数组的尾部65 public int heapExtractMax(int[] array, int heapSize) {66 // 注意优先队列中并不存储下标为0的元素67 if(array.length == 1 || array == null)68 return -1;69 int max = array[1];70 array[1] = array[heapSize];71 MaxHeapify(array, 1, heapSize);72 return max;73 }74 75 // 将数组下标为i的值更改为key,如果key值小于原来索引位置的值,则直接退出76 public void heapIncreaseKey(int[] array, int i, int key) {77 if (key < array[i])78 return;79 array[i] = key;80 while (i > 1 && array[i / 2] < array[i]) {81 exchange(array, i / 2, i);82 i = i / 2;83 }84 }85 86 @Test87 public void test() {88 int[] array = { -1, 4, 1, 3, 2, 16, 9, 10, 14, 8, 7 };89 heapSort(array);90 Array.print(array);91 }92 93 }
堆排序
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。