首页 > 代码库 > 堆排序
堆排序
堆排序算法的时间复杂度为O(nlgn).在堆排序算法中,我们使用的是最大堆。
(1)初始时候,堆排序算法利用BUILD-MAX-HEAP将输入数组A[1..n]建成最大堆。
此时堆的根结点是最大元素,且该元素位于数组A[1]。
接着将A[1]与A[n]互换,则可以将A[1..n]中的最大值置于A[n]。
(2)从堆中删除结点n,即使A[n]不再参与后面的计算。
剩余结点中,其他结点没有改变,因此还是最大堆形式,而新替换的
根结点可能会违背最大堆的性质。所以执行MAX-HEAPIFY(A,1)算法,从而在A[1..n-1]上构造一个新的最大堆。
然后将将A[1]与A[n-1]互换,则可以将A[1..n-1]中的最大值置于A[n-1]。
(3)然后堆排序算法会不断重复过程(2)
,直到堆的大小由n-1变成2.
下面给出伪代码
下面给出示例代码
1 package codeforgod; 2 3 /** 4 * @author gejing gjblmdlm@sina.com 5 * @version 创建时间:2014年4月29日 下午12:43:30 类说明 :堆排序 6 */ 7 public class HeapSortDemo { 8 int heapSize; // 堆元素个数 9 10 /** 11 * 堆排序 12 * 13 * @param a 14 */ 15 public void heapSort(int[] a) { 16 buildMaxHeap(a); 17 for (int i = a.length - 1; i > 0; i--) { 18 int temp = a[0]; 19 a[0] = a[i]; 20 a[i] = temp; 21 heapSize--; 22 maxHeapify(a, 0); 23 } 24 25 } 26 27 /** 28 * 建立最大堆 29 * 30 * @param a 31 */ 32 private void buildMaxHeap(int[] a) { 33 heapSize = a.length; 34 for (int i = a.length / 2 - 1; i >= 0; i--) { 35 maxHeapify(a, i); 36 } 37 38 } 39 40 /** 41 * 最大堆化 42 * 43 * @param a 44 * @param i 45 */ 46 private void maxHeapify(int[] a, int i) { 47 int l = 2 * (i + 1) - 1; // 左孩子下标 48 int r = 2 * (i + 1);// 右孩子下标 49 int largest = i; 50 if (l < heapSize && a[l] > a[i]) { 51 largest = l; 52 } 53 if (r < heapSize && a[r] > a[largest]) { 54 largest = r; 55 } 56 if (largest != i) { 57 int temp = a[i]; 58 a[i] = a[largest]; 59 a[largest] = temp; 60 61 maxHeapify(a, largest); 62 } 63 64 } 65 66 public static void main(String[] args) { 67 HeapSortDemo hs = new HeapSortDemo(); // 实例化一个对象 68 int A[] = { 5, 9, 13, 6, 2, 7, 30, 23, 17, 10 }; 69 System.out.print("原始序列: "); 70 for (int i : A) { 71 System.out.print(i + "\t"); 72 } 73 hs.heapSort(A); // 调用方法进行排序 74 System.out.println(); 75 System.out.print("堆排序后: "); 76 for (int i : A) { 77 System.out.print(i + "\t"); 78 } 79 } 80 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。