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

C语言堆排序

时间:2018-12-11 18:15:18      阅读:230      评论:0      收藏:0      [点我收藏+]

标签:after   class   ++   技术分享   假设   定义   这一   数组   思路   

堆是一种类似二叉树的数据结构,分为最大堆和最小堆,最大堆得定义是当前节点必须大于左右子节点,堆中所有节点都要符合这个定义。最小堆反之。这一点不同于二叉树排序。假设有数组int a[10] = {90,45,21,43,22,77,13,89,56,84},根据最大堆来初始化数组

技术分享图片

最大堆初始化代码思路:用数组最后一个元素来确定最后一个子节点,根据子节点来找到其父节点。先比较左右子节点确定最大子节点,如果父节点大于则不用互换,否则父节点与最大子节点互换。然后父节点减一(利用数组的顺序依次递减来操作所有节点)。当然利用for循环来使父节点的所有子节点(包括子节点的子节点)都符合最大堆的定义。

 1 void maxheap_sortDown(int a[],int start,int end){
 2     
 3     int code = start;
 4     int lchild = code*2+1;
 5     int temp = a[code];
 6     
 7     for(;lchild<=end;code = lchild,lchild = code*2+1){
 8         
 9         if(lchild<end && a[lchild]>a[lchild+1])    
10             lchild++;                        //确定最大子节点,很巧妙 
11         
12         if(a[code]<a[lchild])
13             break;
14         else{
15             a[code] = a[lchild];
16             a[lchild] = temp;
17         }
18         
19     }
20     
21 }
22 
23 void maxheap_sortUp(int a[],int start,int end){
24     
25     int code = start;
26     int lchild = code*2+1;
27     int temp = a[code];
28     
29     for(;lchild<=end;code = lchild,lchild = code*2+1){
30         
31         if(lchild<end && a[lchild]<a[lchild+1])    
32             lchild++;                    //确定最大子节点,很巧妙 
33         
34         if(a[code]>a[lchild])
35             break;
36         else{
37             a[code] = a[lchild];
38             a[lchild] = temp;
39         }
40         
41     }
42     
43 }

堆排序思路:把堆顶的元素与最后一个元素进行互换,互换之后在把除最后一个元素外的所有元素进行堆的定义操作,使其符合最大(小)堆。然后在互换元素,使除最后两个元素外的所有元素进行堆的定义操作,依次进行则排序完成。

 1 void maxheap_sort(int a[],int n){
 2     
 3     int i;
 4     for(i=(n-1)/2;i>=0;i--)    
 5 //      maxheap_sortUp(a,i,n);
 6         maxheap_sortDown(a,i,n);
 7         
 8     int temp = a[0];
 9     a[0] = a[n];
10     a[n] = temp;
11     
12     for(i=n/2-1;i>=0;i--)    
13 //      maxheap_sortUp(a,i,n-1);
14         maxheap_sortDown(a,i,n-1);
15     
16 }

测试:

 1 void main(){
 2     
 3     void maxheap_sort(int a[],int n); 
 4     void maxheap_sortUp(int a[],int start,int end); 
 5     
 6     int a[10] = {90,45,21,43,22,77,13,89,56,84};
 7     int i;
 8     printf("before:");
 9     for(i=0;i<10;i++){
10         printf("%d ",a[i]);
11     }
12         
13         
14     printf("\n");
15     
16     for(i=9;i>=0;i--)
17         maxheap_sort(a,i);
18     
19     printf("after:");
20     for(i=0;i<10;i++){
21         printf("%d ",a[i]);
22     }
23             
24     
25 }

技术分享图片

C语言堆排序

标签:after   class   ++   技术分享   假设   定义   这一   数组   思路   

原文地址:https://www.cnblogs.com/lsy-lsy/p/10103718.html

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