• 堆排序


    一、思想

    1. 堆的初始化,由最底层逐渐向上一层方向,把最大值向上移动,且$heap(parent) >= max(heap(leftchild), heap(rightchild))$
    2. 将最大值移到数组的尾部,将数组尾部的值移动到堆顶。左右孩子的结点各自比较,向上把最大结点的值移动上去。
    3. 父节点为n,$leftchild=2^{n}$, $rightchild=2^{n}+1$。(起始为根节点下标为1)

    二、一些计算 

    1、 满二叉树结点个数$n=2^{i}-1$(等比数列求和$n=frac{a_{0}(1-q^{i})}{1-q}$,复习)。

    2、因此最后一个结点的位置设为n,$frac{n}{2}$就是最后一个父节点的位置了。

    三、Code

     1 package algorithm;
     2 
     3 /**
     4  * Created by adrian.wu on 2019/2/19.
     5  */
     6 public class HeapSort {
     7     /*
     8     1、Parent * 2 + 1 is left child
     9     2、Parent * 2 + 2 is right child
    10      */
    11 
    12     public void headAdjust(int[] array, int parent, int length) {
    13         int pv = array[parent];
    14 
    15         int left = 2 * parent + 1, right = left + 1;
    16 
    17         while (left < length) {
    18             if (right < length && array[left] < array[right]) left = right;
    19             if (pv >= array[left]) break;
    20             array[parent] = array[left];
    21             parent = left;
    22             left = 2 * left + 1;
    23             right = left + 1;
    24         }
    25 
    26         array[parent] = pv;
    27     }
    28 
    29     /*
    30     1、sort from back to front
    31     2、
    32      */
    33     public void heapSort(int[] array) {
    34         //create heap, i-1(when root index starting from 0, if 1 that i is 1)
    35         for (int i = array.length / 2; i >= 0; i--) {
    36             headAdjust(array, i-1, array.length); 
    37         }
    38 
    39         //move the head to the end of the list, then recreate the head. 
    40         for (int i = array.length - 1; i > 0; i--) {
    41             int temp = array[i];
    42             array[i] = array[0];
    43             array[0] = temp;
    44             headAdjust(array, 0, i);
    45         }
    46     }
    47 }
    谢谢!
  • 相关阅读:
    【NOIP】提高组2015 运输计划
    【BZOJ】1635: [Usaco2007 Jan]Tallest Cow 最高的牛
    【51nod】1766 树上的最远点对
    【BZOJ】2054: 疯狂的馒头
    【SRM20】数学场
    【Luogu】P3930 SAC E#1
    【Luogu】P3927 SAC E#1
    【Luogu】 P3928 SAC E#1
    【Codeforces】868C. Qualification Rounds
    【CodeForces】866D. Buy Low Sell High
  • 原文地址:https://www.cnblogs.com/ylxn/p/10401596.html
Copyright © 2020-2023  润新知