zoukankan      html  css  js  c++  java
  • 堆排

    先给出个慢不错的堆排博客:http://www.cnblogs.com/kkun/archive/2011/11/23/2260286.html

    关于最大堆:最大堆中的堆并非指堆栈的堆,而是另一种数据结构。最大堆是一种特殊的完全二叉树,其还满足所有父亲节点不小于其左右儿子这个条件。显然堆顶元素为最大元素。

    堆排可以分为三步:

    1. 将待排序数组建立成最大堆

    2. 取当前堆顶元素加入已就序数组

    3. 维护2中除去堆顶元素的最大堆

    代码:

     1 #include <iostream>
     2 using namespace std;
     3 
     4 const int MAXN=1e6+10;
     5 
     6 void heapadjust(int array[MAXN], int i, int length){//维护最大堆
     7     int l;
     8     for(; i*2+1<length; i=l){
     9         int l=i*2+1;//左儿子
    10         if(l<length-1&&array[l+1]>array[l]){
    11             l++;//若右儿子大于左儿子,令右儿子为左儿子
    12         }
    13         if(array[i]<array[l]){
    14             array[i]=array[l]^array[i];
    15             array[l]=array[l]^array[i];
    16             array[i]=array[l]^array[i];
    17         }else break;
    18     }
    19 }
    20 
    21 void heapsort(int array[MAXN], int length){
    22     for(int i=length/2-1; i>=0; i--){//初始时构建最大堆
    23         heapadjust(array, i, length);
    24     }
    25     for(int i=length-1; i>0; i--){
    26         array[i]=array[0]^array[i];//将堆顶元素加入已就序数组
    27         array[0]=array[0]^array[i];
    28         array[i]=array[0]^array[i];
    29         heapadjust(array, 0, i);//缩小范围并调整最大堆
    30     }
    31 }
    32 
    33 int main(void){
    34     int n, a[MAXN];
    35     cin >> n;
    36     for(int i=0; i<n; i++){
    37         cin >> a[i];
    38     }
    39     heapsort(a, n);
    40     for(int i=0; i<n; i++){
    41         cout << a[i] << " ";
    42     }
    43     cout << endl;
    44     return 0;
    45 }
    View Code
  • 相关阅读:
    MySQL记录
    yolo
    python 深度学习 库文件安装出错汇总
    OPENCV安装
    vs code安装leetcode插件
    打印机
    标注工具
    训练源代码训练数据集
    c++ 学习
    复现基于Pytorch的YOLOv3所踩的坑~
  • 原文地址:https://www.cnblogs.com/geloutingyu/p/6675748.html
Copyright © 2011-2022 走看看