zoukankan      html  css  js  c++  java
  • 堆排序

    堆的本质上其实就是一个数组。

    分为大根堆和小根堆

    大根堆:父亲的值 > 孩子;  

    小根堆:父亲的值  < 孩子;

    堆排序:与选择排序类似,也是选择最大的放在最后的位置。

        优点:比选择排序快,因为在当第一次排好大根堆后,把根与最后一个值交换。这是树中只需要调整根,也就是在左孩子和右孩子中选择一个大的与之交换,然后交换的继续向下调整。所以左子树或右子树,一定有一个不动,继续调整大根堆时,最多比较树的高度次,(log2n向下取整+1)所以与选择排序相比减少了很多次比较。

    代码:

     1 #define LEFT (Root*2+1)
     2 #define RIGHT (Root*2+2)
     3 void Heap(int* arr,int len,int Root)
     4 {
     5     int index;
     6     while(1)
     7     {
     8         if(RIGHT < len )//有左,右孩子
     9          {
    10              //左右孩子中大的
    11             // printf("999
    ");
    12             index = arr[LEFT] > arr[RIGHT] ? LEFT : RIGHT;
    13          }
    14          else if(LEFT < len)//只有左孩子
    15         {
    16             index = LEFT;
    17         }
    18         else//没孩子
    19             break;
    20         if(arr[index] > arr[Root]) //与根交换
    21          {
    22              arr[index] = arr[index]^arr[Root];
    23              arr[Root] = arr[index]^arr[Root];
    24              arr[index] = arr[index]^arr[Root];
    25              Root = index;
    26          }
    27          else
    28             break;
    29 
    30     }
    31 }
    32 void HeapSort(int* arr,int len)
    33 {
    34     if(arr == NULL || len <= 0) return;
    35     //第一次调整需要调节所有父亲节点
    36      for(int i = len/2-1;i >=0 ;i--)
    37         Heap(arr,len,i);
    38 
    39     //排序
    40     for(int i = len-1;i>0;i--)
    41     {
    42         //交换
    43         arr[0] = arr[0]^arr[i];
    44         arr[i] = arr[0]^arr[i];
    45         arr[0] = arr[0]^arr[i];
    46 
    47         //调整根
    48         Heap(arr,i,0);
    49     }
    50 }
  • 相关阅读:
    快速幂和矩阵快速幂-模板
    gcd-模板+最小公倍数
    manacher-模板-hd-3068
    kmp-模板-hd-1711
    链式前向星-邻接表--模板
    poj-3096-Suprising Strings
    hihocoder-1615-矩阵游戏II
    hihocoder-Week174-Dice Possibility
    论文-Swish: A self-gated Active Function
    hihocoder-1595-Numbers
  • 原文地址:https://www.cnblogs.com/Lune-Qiu/p/9117006.html
Copyright © 2011-2022 走看看