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

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 #include<time.h>
     4 #include<algorithm>
     5 
     6 using namespace std;
     7 const int N=15;
     8 void change(int a[],int f,int t)
     9 {
    10     int tmp=a[f];
    11     int i=f;
    12     int j=i*2;
    13     bool isfinish=0;
    14     while(j<=t && !isfinish)
    15     {
    16         if(j<t && a[j]<a[j+1])            //j<t
    17             j+=1;
    18         if(tmp>=a[j])
    19             isfinish=true;
    20         else
    21         {
    22             a[i]=a[j];
    23             i=j;
    24             j=j*2;
    25         }
    26     }
    27     a[i]=tmp;
    28 }
    29 
    30 void crh(int a[] ,int n)
    31 {
    32     for(int i=n/2 ; i>=1 ; --i)
    33         change(a,i,n);
    34 }
    35 
    36 void hs(int a[],int len)
    37 {
    38     int n,i;
    39     crh(a,len);
    40     n=len;
    41     for(int i=n ; i>=2 ; --i)
    42     {
    43         int tmp=a[1];
    44         a[1]=a[i];
    45         a[i]=tmp;
    46         change(a,1,i-1);
    47     }
    48 }
    49 int main()
    50 {
    51     int a[N+1];                        //【warning】这里必须N+1,下标从1开始,0没用到,只1到14可以用,没有15个数字,会非法越界
    52     for(int i=1 ; i<=N ; ++i)
    53         a[i]=rand()%100;
    54     printf("init   arr:");
    55     for(int i=1 ; i<=N ; ++i)
    56         printf("%d ",a[i]);
    57     printf("
    ");
    58     hs(a,N);
    59     printf("sorted arr:");
    60     for(int i=1 ; i<=N ; ++i)
    61         printf("%d ",a[i]);
    62     printf("
    
    ");
    63     system("pause");
    64     return 0;
    65 }

    大顶堆,小顶堆完成代码,调用hs大顶堆,从小到大排序;调用hs2小顶堆,从大到小排序

     1 void crh(int a[] ,int n)                    //堆排序,大顶堆
     2 {
     3     for(int i=n/2 ; i>=1 ; --i)
     4         change(a,i,n);
     5 }
     6 
     7 void hs(int a[],int len)                    //堆排序,大顶堆
     8 {
     9     int n,i;
    10     crh(a,len);
    11     n=len;
    12     for(int i=n ; i>=2 ; --i)
    13     {
    14         int tmp=a[1];
    15         a[1]=a[i];
    16         a[i]=tmp;
    17         change(a,1,i-1);
    18     }
    19 }
    20 
    21 void change2(int a[],int f,int t)            //堆排序,小顶堆
    22 {
    23     int i,j,tmp;
    24     tmp=a[f];
    25     i=f;
    26     j=i*2;
    27     bool isOK=0;
    28     while(j<=t && !isOK)
    29     {
    30         if(j<t && a[j]>a[j+1])
    31             j+=1;
    32         if(tmp<=a[j])                    //小顶堆
    33             isOK=1;
    34         else
    35         {
    36             a[i]=a[j];
    37             i=j;
    38             j*=2;
    39         }
    40     }
    41     a[i]=tmp;
    42 }
    43 
    44 void crh2(int a[],int len)                    //堆排序,小顶堆
    45 {
    46     for(int i=len/2 ; i>=1 ; --i)
    47         change2(a,i,len);
    48 }
    49 
    50 void hs2(int a[],int len)                    //堆排序,小顶堆
    51 {
    52     crh2(a,len);
    53     
    54     for(int i=len ; i>=2 ; --i)
    55     {
    56         int tmp=a[1];
    57         a[1]=a[i];
    58         a[i]=tmp;                //勿写a[1]!!
    59         change2(a,1,i-1);
    60     }
    61 }
  • 相关阅读:
    游记 Day10
    游记 Day9
    NOIP模拟测试10
    【贪心】P3942 将军令 && P2279 消防局的设立
    在没有上考场之前,菜鸡也有翻盘的机会
    【数据结构】 圆方树&&广义圆方树
    快速幂&&龟速乘&&快速乘
    游记 Day 4
    【容斥】[ZJOI2016] 小星星
    游记 Day3
  • 原文地址:https://www.cnblogs.com/Evence/p/4475004.html
Copyright © 2011-2022 走看看