zoukankan      html  css  js  c++  java
  • 排序算法_HeapSort

    大根堆排序的基本思想: 
    1) 先将初始文件R[1..n]建成一个大根堆,此堆为初始的无序区;
    2) 再将关键字最大的记录R[1](即堆顶)和无序区的最后一个记录R[n]交换,
        由此得到新的无序区R[1..n-1]和有序区R[n],且满足R[1..n-1].keys≤R[n].key;
    3) 由于交换后新的根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]调整为堆。

     1 /*  
     2 大根堆排序的基本思想: 
     3 1) 先将初始文件R[1..n]建成一个大根堆,此堆为初始的无序区; 
     4 2) 再将关键字最大的记录R[1](即堆顶)和无序区的最后一个记录R[n]交换,
     5     由此得到新的无序区R[1..n-1]和有序区R[n],且满足R[1..n-1].keys≤R[n].key; 
     6 3) 由于交换后新的根R[1]可能违反堆性质,故应将当前无序区R[1..n-1]调整为堆。 
     7     然后再次将R[1..n-1]中关键字最大的记录R[1]和该区间的最后一个记录R[n-1]交换,
     8     由此得到新的无序区R[1..n-2]和有序区R[n-1..n],且仍满足关系 R[1..n-2].keys≤R[n-1..n].keys,同样要将R[1..n-2]调整为堆。
     9 */
    10 
    11 /*
    12  @brief:
    13      已知L->r[s..len]中记录的关键字除L->r[s]之外均满足堆的定义,
    14      本函数调整L->r[s]的关键字,使L->r[s..len]成为一个大顶堆
    15  @param:
    16     cur: 当前位置 s
    17     len: 当前状态的最大值
    18 
    19 m:当前堆的大小
    20  */
    21 void HeapAdjust(SqList *L, int cur, int len)
    22 { 
    23     int temp = L->r[cur];
    24     for(int j = 2*cur; j <= len; j *= 2)// 沿关键字较大的孩子结点向下筛选(大根堆)
    25     {
    26         if(j < len && L->r[j] < L->r[j+1])
    27             ++j;                        // j为关键字中较大的记录的下标
    28         if(temp >= L->r[j])
    29             break;                        /* 应插入在位置 cur 上 */
    30 
    31         L->r[cur] = L->r[j];
    32         cur = j;
    33     }
    34     L->r[cur] = temp;                    /* 插入 */
    35 }
    36 
    37 /*  对顺序表L进行堆排序 */
    38 void HeapSort( SqList* L )
    39 {
    40     for( int i = L->length/2; i>0; i--)    /*  把L中的r构建成一个大根堆 */
    41          HeapAdjust(L, i, L->length);
    42 
    43     for( int i = L->length; i>1; i--)
    44     { 
    45          swap(L, 1, i);                /* 将堆顶记录和当前未经排序子序列的最后一个记录交换 */
    46          HeapAdjust(L, 1, i-1);        /* 将L->r[1..i-1]重新调整为大根堆 */
    47     }
    48 }
  • 相关阅读:
    《设计模式》(精华集)
    TClientDataSet使用(二)
    害我查了半天的错误!av错误,小心Component对象使用Application当Owner
    释放自己
    最近在转C#
    TClientDataSet的使用技巧
    小心使用可修改的常量。
    指数函数和正弦函数相乘
    adb 常用命令
    win7下ie9设置无法保存的问题
  • 原文地址:https://www.cnblogs.com/uestc999/p/3946766.html
Copyright © 2011-2022 走看看