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

    堆排序

     1 // 将待排序的最后一个元素current插入大根堆中
     2 void insert_heap(int *arr, int current, int low, int high)
     3 {
     4     //记录low的孩子结点中较大元素的下标,初始化为左孩子
     5     int large = 2*low + 1;
     6     while(large <= high)
     7     {
     8         //右孩子较大
     9         if(large < high && arr[large] < arr[large+1])
    10             large++;
    11         //当前元素大于所有孩子
    12         if(current >= arr[large])
    13             break;
    14         else//当前元素小于左右孩子中较大的一个
    15         {
    16             arr[low] = arr[large];
    17             low = large;
    18             large = 2*low + 1;
    19         }
    20     }
    21     //将目标元素插入合适的位置
    22     arr[low] = current;
    23 }
    24 
    25 //建堆
    26 void build_heap(int *arr, int n)
    27 {
    28     int low, current;
    29     //从最后一个非叶结点开始
    30     for(low = n/2 - 1; low >= 0; low--)
    31     {
    32         current = arr[low];
    33         insert_heap(arr,current,low,n-1);
    34     }
    35 }
    36 
    37 //堆排序,从后往前,每次将堆头最大的元素放到堆尾,同时将堆尾元素插入到堆中
    38 void hearSort(int *arr, int n)
    39 {
    40     int current;//暂存待插入的元素
    41     int last_unsorted;//未排序的最后一个元素
    42     build_heap(arr,n);//建堆
    43 
    44     for(last_unsorted = n-1; last_unsorted > 0; last_unsorted--)
    45     {
    46         current = arr[last_unsorted];//暂存堆尾元素
    47         arr[last_unsorted] = arr[0];//堆头元素放在堆尾
    48         insert_heap(arr,current,0,last_unsorted-1);//未排序的堆尾元素插入堆
    49     }
    50 }
  • 相关阅读:
    我最讨厌画图,这辈子我都不想再画图
    bzoj1218[HNOI2003]激光炸弹
    bzoj1196[HNOI2006]公路修建问题
    bzoj1588[HNOI2002]营业额统计
    bzoj2039[2009国家集训队]employ人员雇佣
    bzoj3874[Ahoi2014]宅男计划
    bzoj2282[Sdoi2011]消防
    bzoj1798[Ahoi2009]Seq 维护序列seq
    bzoj4003[JLOI2015]城池攻占
    bzoj2809[Apio2012]dispatching
  • 原文地址:https://www.cnblogs.com/cpsmile/p/4424963.html
Copyright © 2011-2022 走看看