首页 > 编程语言 > 详细

堆排序

时间:2017-02-21 00:30:56      阅读:263      评论:0      收藏:0      [点我收藏+]

  

 1 #include<stdio.h>
 2 #include<iostream>
 3 using namespace std;
 4 
 5 
 6 void print(int a[], int n){  
 7     for(int j= 0; j<n; j++){  
 8         cout<<a[j] <<"  ";  
 9     }  
10     cout<<endl;  
11 }  
12   
13   
14   
15 /** 
16  * 已知H[s…m]除了H[s] 外均满足堆的定义 
17  * 调整H[s],使其成为大顶堆.即将对第s个结点为根的子树筛选,  
18  * 
19  * @param H是待调整的堆数组 
20  * @param s是待调整的数组元素的位置 
21  * @param length是数组的长度 
22  * 
23  */  
24 void HeapAdjust(int H[],int s, int length)  
25 {  
26     int tmp  = H[s];  
27     int child = 2*s+1; //左孩子结点的位置。(i+1 为当前调整结点的右孩子结点的位置)  
28     while (child < length) {  
29         if(child+1 <length && H[child]<H[child+1]) { // 如果右孩子大于左孩子(找到比当前待调整结点大的孩子结点)  
30             ++child ;  
31         }  
32         if(H[s]<H[child]) {  // 如果较大的子结点大于父结点  
33             H[s] = H[child]; // 那么把较大的子结点往上移动,替换它的父结点  
34             s = child;       // 重新设置s ,即待调整的下一个结点的位置  
35             child = 2*s+1;  
36         }  else {            // 如果当前待调整结点大于它的左右孩子,则不需要调整,直接退出  
37              break;  
38         }  
39         H[s] = tmp;         // 当前待调整的结点放到比其大的孩子结点位置上  
40     }  
41     print(H,length);  
42 }  
43   
44   
45 /** 
46  * 初始堆进行调整 
47  * 将H[0..length-1]建成堆 
48  * 调整完之后第一个元素是序列的最小的元素 
49  */  
50 void BuildingHeap(int H[], int length)  
51 {   
52     //最后一个有孩子的节点的位置 i=  (length -1) / 2  
53     for (int i = length/2 -1 ; i >= 0; --i)  
54         HeapAdjust(H,i,length);  
55 }  
56 /** 
57  * 堆排序算法 
58  */  
59 void HeapSort(int H[],int length)  
60 {  
61     //初始堆  
62     BuildingHeap(H, length);  
63     //从最后一个元素开始对序列进行调整  
64     for (int i = length - 1; i > 0; --i)  
65     {  
66         //交换堆顶元素H[0]和堆中最后一个元素  
67         int temp = H[i]; H[i] = H[0]; H[0] = temp;  
68         //每次交换堆顶元素和堆中最后一个元素之后,都要对堆进行调整  
69         HeapAdjust(H,0,i);  
70   }  
71 }   
72   
73 int main(){  
74     int H[10] = {3,1,5,7,2,4,9,6,10,8};  
75     cout<<"初始值:";  
76     print(H,10);  
77     HeapSort(H,10);  
78     //selectSort(a, 8);  
79     cout<<"结果:";  
80     print(H,10);  
81   
82 }  

 

堆排序

原文:http://www.cnblogs.com/13224ACMer/p/6422105.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!