堆排序
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("\n"); 58 hs(a,N); 59 printf("sorted arr:"); 60 for(int i=1 ; i<=N ; ++i) 61 printf("%d ",a[i]); 62 printf("\n\n"); 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 }