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

    实现堆排序需要解决两个问题:

    1、如何将n个待排序的数建成堆

    2、输出堆顶元素之后。如何调整剩余n-1个元素,使其成为一个新堆

    使用最大堆来进行堆排序算法实现,所谓堆排序就是每次交换堆顶元素与堆中最后一个元素,然后对前面的堆中的元素从堆顶开始调整。

    具体代码如下:

     1 #include <iostream>
     2 
     3 using namespace std;
     4 
     5 
     6 
     7 void print(int a[],int n)
     8 {
     9     for(int j=0;j<n;j++)
    10         cout<<a[j]<<" ";
    11     cout<<endl;
    12 }
    13 
    14 //调整堆过程
    15 
    16 void heapAdjust(int H[],int s,int length)
    17 {
    18     int tmp=H[s];
    19 
    20     int child=2*s+1;
    21     while(child<length)
    22     {
    23         if(child+1<length&&H[child]<H[child+1])
    24             ++child;
    25 
    26         if(H[s]<H[child])
    27         {
    28             H[s]=H[child];
    29             s=child;
    30             child=2*s+1;
    31         }
    32         else
    33             break;
    34         H[s]=tmp;
    35     }
    36     print(H,length);
    37 }
    38 //初始建堆过程
    39 void buildingHeap(int H[],int length)
    40 {
    41     //从最后一个人有孩子的节点的位置i=(length-1)/2开始
    42     for(int i=(length-1)/2;i>=0;--i)
    43          heapAdjust(H,i,length);
    44 }
    45 //堆排序算法
    46 void heapSort(int H[],int length)
    47 {
    48     buildingHeap(H,length);
    49 
    50     for(int i=length-1;i>0;i--)
    51     {
    52       //交换堆顶元素与对中的最后一个元素之后,对堆进行调整
    53       int temp=H[i];
    54       H[i]=H[0];H[0]=temp;
    55       heapAdjust(H,0,i);
    56     }
    57 }
    58 
    59 int main()
    60 {
    61     int H[10]={3,1,5,7,2,4,9,6,10,8};
    62     heapSort(H,10);
    63 
    64     cout<<"结果"<<endl;
    65 
    66     print(H,10);
    67 }
  • 相关阅读:
    C 语言定义
    一次系统磁盘异常使用100%的处理
    supervisord 安装、配置体验
    uva 211(dfs)
    poj1651
    有一种感动叫ACM(记WJMZBMR在成都赛区开幕式上的讲话)
    nyoj-746
    Codeforces Round #308 (Div. 2)----C. Vanya and Scales
    long long 与 _int64
    石子归并问题(nyoj737)
  • 原文地址:https://www.cnblogs.com/xiaoying1245970347/p/5145869.html
Copyright © 2011-2022 走看看