4-5 HeapSort.c
1 #include <stdio.h> 2 #include "4-1 CreateData.c" 3 #define ARRAYLEN 10 4 void HeapAdjust(int a[],int s,int n)//构成堆 5 { 6 int j,t; 7 while(2*s+1<n) //第s个结点有右子树 8 { 9 j=2*s+1 ; 10 if((j+1)<n) 11 { 12 if(a[j]<a[j+1])//右左子树小于右子树,则需要比较右子树 13 j++; //序号增加1,指向右子树 14 } 15 if(a[s]<a[j])//比较s与j为序号的数据 16 { 17 t=a[s]; //交换数据 18 a[s]=a[j]; 19 a[j]=t; 20 s=j ;//堆被破坏,需要重新调整 21 } 22 else //比较左右孩子均大则堆未破坏,不再需要调整 23 break; 24 } 25 } 26 void HeapSort(int a[],int n)//堆排序 27 { 28 int t,i; 29 int j; 30 for(i=n/2-1;i>=0;i--) //将a[0,n-1]建成大根堆 31 HeapAdjust(a, i, n); 32 for(i=n-1;i>0;i--) 33 { 34 t=a[0];//与第i个记录交换 35 a[0] =a[i]; 36 a[i] =t; 37 HeapAdjust(a,0,i); //将a[0]至a[i]重新调整为堆 38 } 39 } 40 int main() 41 { 42 int i,a[ARRAYLEN]; 43 for(i=0;i<ARRAYLEN;i++) 44 a[i]=0; 45 if(!CreateData(a,ARRAYLEN,1,100)) 46 { 47 printf("生成随机数不成功!\n"); 48 getch(); 49 return 1; 50 } 51 printf("原数据:"); 52 for(i=0;i<ARRAYLEN;i++) 53 printf("%d ",a[i]); 54 printf("\n"); 55 HeapSort(a,ARRAYLEN); 56 printf("排序后:"); 57 for(i=0;i<ARRAYLEN;i++) 58 printf("%d ",a[i]); 59 printf("\n"); 60 getch(); 61 return 0; 62 }
时间: 2024-11-03 22:44:38