风也温柔

计算机科学知识库

堆排序算法java-堆排序算法(Java实现)

  1.数据结构——堆(Heap)

  堆是计算机科学中一类特殊的数据结构的总称,是可以看成一棵树的数组对象。

  堆总是满足以下两条性质:

  堆排序算法java_排序精算法_dijkstra算法堆优化

  1.堆中的每一个节点都满足其值总是大于或小于它的所有子结点。

  dijkstra算法堆优化_堆排序算法java_排序精算法

  2.堆总是一棵完全二叉树。

  如果堆的每一个节点满足其值总是大于它的孩子结点,则堆为大顶堆,如果堆的每一个节点满足其值总是小于它的孩子结点,则堆为小顶堆。

  2.算法思想

  堆排序()是指利用堆这种数据结构所设计的一种排序算法。堆排序的基本思想是:将待排序序列构造成一个大顶堆(或小顶堆)堆排序算法java-堆排序算法(Java实现),此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,在根节点处就可以得到一个次大值,如此反复执行,重复n次堆排序算法java堆排序算法java,便能得到一个有序序列了。它的平均时间复杂度为O(nlogn)。

  构造大顶堆或小顶堆时,采用的是由下而上构造堆的思想,先将每个节点的左右子树构造成堆,然后再将该节点与其左右子堆合并成一个大堆,以此由下而上将整棵树构造成小堆顶或大顶堆。

  代码实现:

<p><pre>class heap{

//堆排序
public int[] heapSort(int[]A){
    for(int i=A.length;i>=1;i--){
        //将数组前i个数的最大值提取到数组第一个位置
        getTopMax(A,i);
        //将这个最大值置换到数组的末尾
        int temp=A[0];
        A[0]=A[i-1];
        A[i-1]=temp;
    }
    return A;
}
//提取数组[0,len]区间内的最大值
public void getTopMax(int[]A, int len){
    //找到树中最后一个非叶子节点的位置
    int pos=len/2-1;
    for(int i=pos;i>=0;i--){
        //得到当前节点的左右孩子节点对应的下标(如果不存在则赋值为当前节点下标)
        int left=2*i+1>=len?i:2*i+1;
        int right=2*i+2>=len?i:2*i+2;
        /**
         * 取出该节点及其左右孩子节点中的最大节点值,置换到该节点的位置,
         * 保证该节点的值比其左右孩子的值要大
         */
        if(A[i]