码迷,mamicode.com
首页 > 编程语言 > 详细

4.5 堆排序法

时间:2016-07-19 09:23:10      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:

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 }

 

4.5 堆排序法

标签:

原文地址:http://www.cnblogs.com/wozixiaoyao/p/5683152.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!