堆排序

 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 }
原文地址:https://www.cnblogs.com/Evence/p/4475004.html