码迷,mamicode.com
首页 > 其他好文 > 详细

堆排序

时间:2014-07-11 19:45:59      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   文件   os   

堆排序利用了大根堆(或小根堆)堆顶记录的关键字最大(或最小)这一特征,使得在当前无序区中选取最大(或最小)关键字的记录变得简单。
(1)用大根堆排序的基本思想
① 先将初始文件R[1..n]建成一个大根堆,此堆为初始的无序区
② 再将关键字最大的记录R[1](即堆顶)和无序区的最后一个记录R[n]交换,由此得到新的无序区R[1..n-1]和有序区R[n],且满足R[1..n-1].keys≤R[n].key
③由于交换后新的根R[1]可能违反堆性质,故应将当前无序区R[1..n-1]调整为堆。然后再次将 R[1..n-1]中关键字最大的记录R[1]和该区间的最后一个记录R[n-1]交换,由此得到新的无序区R[1..n-2]和有序区R[n- 1..n],且仍满足关系R[1..n-2].keys≤R[n-1..n].keys,同样要将R[1..n-2]调整为堆。
……
直到无序区只有一个元素为止。
(2)大根堆排序算法的基本操作:
① 初始化操作:将R[1..n]构造为初始堆;
② 每一趟排序的基本操作:将当前无序区的堆顶记录R[1]和该区间的最后一个记录交换,然后将新的无序区调整为堆(亦称重建堆)。

注意

①只需做n-1趟排序,选出较大的n-1个关键字即可以使得文件递增有序。
②用小根堆排序与利用大根堆类似,只不过其排序结果是递减有序的。堆排序和直接选择排序相反:在任何时刻堆排序中无序区总是在有序区之前,且有序区是在原向量的尾部由后往前逐步扩大至整个向量为止

特点

堆排序(HeapSort)是一树形选择排序。堆排序的特点是:在排序过程中,将R[l..n]看成是一棵完全二叉树顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系(参见二叉树的顺序存储结构),在当前无序区中选择关键字最大(或最小)的记录
 
 
 
  1 package test;
  2 /**
  3  * 
  4  * 平均性能O(N*logN)。
  5  * 堆排序是就地排序,辅助空间为O(1)
  6  * 它是不稳定的排序方法
  7  * @author xixingwang
  8  *
  9  */
 10 public class HeapSort {
 11     private static int[] sort = new int[] { 1, 0, 10, 20, 3, 5, 6, 4, 9, 8, 12,
 12             17, 34, 11 };
 13 
 14     public static void main(String[] args) {
 15         //初始化堆
 16         buildMaxHeapify(sort);
 17         heapSort(sort);
 18         print(sort);
 19     }
 20 
 21     private static void buildMaxHeapify(int[] data) {
 22         // 没有子节点的才需要创建最大堆,从最后一个的父节点开始
 23         int startIndex = getParentIndex(data.length - 1);//找到最后一个元素的父节点
 24         // 从尾端开始创建最大堆,每次都是正确的堆
 25         for (int i = startIndex; i >= 0; i--) {
 26             maxHeapify(data, data.length, i);
 27         }
 28     }
 29 
 30     /**
 31      * 创建最大堆
 32      * 
 33      * @param data
 34      * @paramheap Size需要创建最大堆的大小,一般在sort的时候用到,因为最多值放在末尾,末尾就不再归入最大堆了
 35      * @param index当前需要创建最大堆的位置
 36      */
 37     private static void maxHeapify(int[] data, int heapSize, int index) {
 38         // 当前点与左右子节点比较
 39         int left = getChildLeftIndex(index);
 40         int right = getChildRightIndex(index);
 41 
 42         int largest = index;
 43         if (left < heapSize && data[index] < data[left]) {
 44             largest = left;
 45         }
 46         if (right < heapSize && data[largest] < data[right]) {
 47             largest = right;
 48         }
 49         // 得到最大值后可能需要交换,如果交换了,其子节点可能就不是最大堆了,需要重新调整
 50         if (largest != index) {
 51             int temp = data[index];
 52             data[index] = data[largest];
 53             data[largest] = temp;
 54             maxHeapify(data, heapSize, largest);
 55         }
 56     }
 57 
 58     /**
 59      * 排序,最大值放在末尾,data虽然是最大堆,在排序后就成了递增的
 60      * 
 61      * @param data
 62      */
 63     private static void heapSort(int[] data) {
 64         // 末尾与头交换,交换后调整最大堆
 65         for (int i = data.length - 1; i > 0; i--) {
 66             int temp = data[0];
 67             data[0] = data[i];
 68             data[i] = temp;
 69             maxHeapify(data, i, 0);
 70         }
 71     }
 72 
 73     /**
 74      * 父节点位置
 75      * 
 76      * @param current
 77      * @return
 78      */
 79     private static int getParentIndex(int current) {
 80         return (current - 1) >> 1;//(current-1)/2
 81     }
 82 
 83     /**
 84      * 左子节点position注意括号,加法优先级更高
 85      * 
 86      * @param current
 87      * @return
 88      */
 89     private static int getChildLeftIndex(int current) {
 90         return (current << 1) + 1;//current *2 +1
 91     }
 92 
 93     /**
 94      * 右子节点position
 95      * 
 96      * @param current
 97      * @return
 98      */
 99     private static int getChildRightIndex(int current) {
100         return (current << 1) + 2;//current *2 +2
101     }
102 
103     private static void print(int[] data) {
104         for (int i = 0; i < data.length; i++) {
105             
106             System.out.print(data[i] + "|");
107         }
108     }
109 
110 }

 

堆排序,布布扣,bubuko.com

堆排序

标签:style   blog   http   color   文件   os   

原文地址:http://www.cnblogs.com/xxwacm/p/3833503.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!