堆排序-2
package com.ghj.util; public class sortAlgorithm<T extends Comparable<T>> { // 交换索引i和索引j的值 private void swap(T[] data, int i, int j) { T tmp; tmp = data[i]; data[i] = data[j]; data[j] = tmp; } // -----堆排序 时间复杂度O(nlogn)----- public void heapSort(T[] data) { int arrayLength = data.length; // 循环建大顶堆 for (int i = 0; i < arrayLength - 1; i++) { // 建堆 builMindHeap(data, arrayLength - 1 - i); // 交换堆顶和最后一个元素 swap(data, 0, arrayLength - 1 - i); } } // 对data数组从0到lastIndex建大顶堆 private void builMaxdHeap(T[] data, int lastIndex) { // 从lastIndex处节点(最后一个节点)的父节点开始 for (int i = (lastIndex - 1) / 2; i >= 0; i--) { // k 保存当前正在判断的节点 int k = i; // 如果当前节点有子节点 while (k * 2 + 1 <= lastIndex) { // 当前节点的左子节点的索引 int biggerIndex = 2 * k + 1; // 如果biggerIndex 小于lastIndex ,则biggerIndex + 1; // 代表的k节点的右子节点存在 if (biggerIndex < lastIndex) { // 如果右子节点的值比较大 if (data[biggerIndex].compareTo(data[biggerIndex + 1]) < 0) { // biggerIndex总是记录较大的子节点的索引 biggerIndex++; } } // 如果k节点的值小于其较大的子节点的值 if (data[k].compareTo(data[biggerIndex]) < 0) { // 交换他们 swap(data, k, biggerIndex); // 将biggerIndex赋给k,开始下一次循环 // 重新保证k节点的值大于其左右子节点的值 k = biggerIndex; } else { break; } } } } // 对data数组从0到lastIndex建小顶堆 private void builMindHeap(T[] data, int lastIndex) { // 从lastIndex处节点(最后一个节点)的父节点开始 for (int i = (lastIndex - 1) / 2; i >= 0; i--) { // k 保存当前正在判断的节点 int k = i; // 如果当前节点有子节点 while (k * 2 + 1 <= lastIndex) { // 当前节点的左子节点的索引 int minnerIndex = 2 * k + 1; // 如果minnerIndex 大于 lastIndex ,则minnerIndex + 1; // 代表的k节点的右子节点存在 if (minnerIndex < lastIndex) { // 如果右子节点的值比较小 if (data[minnerIndex].compareTo(data[minnerIndex + 1]) > 0) { // minnerIndex总是记录较小的子节点的索引 minnerIndex++; } } // 如果k节点的值大于其较小的子节点的值 if (data[k].compareTo(data[minnerIndex]) > 0) { // 交换他们 swap(data, k, minnerIndex); // 将minnerIndex赋给k,开始下一次循环 // 重新保证k节点的值小于其左右子节点的值 k = minnerIndex; } else { break; } } } } private static String getString(Comparable[] data) { String result = ""; for (int i = 0; i < data.length; i++) { result = result + data[i].toString(); } return result; } /** * @param args */ public static void main(String[] args) { sortAlgorithm sort = new sortAlgorithm<>(); Comparable[] data = { 1, 5, 2, 9, 3 }; System.out.println("Before sort : " + getString(data)); sort.heapSort(data); System.out.println("After sort : " + getString(data)); } }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。