堆排序算法

堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] >= A[i]。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。

 

 1 void heapSort(int array[],int length)
 2 {
 3     int i ;
 4     //调整序列的前半部分元素,调整完之后第一个元素是序列的最大的元素
 5     //length/2-1是最后一个非叶节点,此处"/"为整除
 6     for (i = length/2 - 1; i >= 0; --i) {
 7         HeapAdjust(array, i, length);
 8     }
 9     
10     //从最后一个元素开始对序列进行调整,不断的缩小调整的范围直到第一个元素
11     for (i = length - 1; i > 0; --i) {
12         
13         //把第一个元素和当前的最后一个元素交换,
14         //保证当前的最后一个位置的元素都是在现在的这个序列之中最大的
15         array[i] = array[0]^array[i];
16         array[0] = array[0]^array[i];
17         array[i] = array[0]^array[i];
18         //不断缩小调整heap的范围,每一次调整完毕保证第一个元素是当前序列的最大值
19         HeapAdjust(array, 0, i);
20     }
21 }
22 
23 //array是待调整的堆数组,i是待调整的数组元素的位置,nlength是数组的长度
24 //本函数功能是:根据数组array构建大根堆
25 void HeapAdjust(int array[],int i,int nLength)
26 {
27     int biggerChild;
28     int  temp;
29     for (; 2*i + 1 < nLength; i = biggerChild) {
30         //左子结点的位置=2*(父结点位置)+1
31         biggerChild = 2 * i + 1;
32         //查找左右子节点中的较大值
33         if (biggerChild < nLength - 1 && array[biggerChild + 1]> array[biggerChild]) {
34             biggerChild ++;
35         }
36         //如果较大值比父节点大,则把较大值的节点交换给父节点,以完成最大堆
37         if (array[i] < array[biggerChild]) {
38             temp = array[biggerChild];
39             array[biggerChild] = array[i];
40             array[i] = temp;
41         }
42         else
43         {
44             break;
45         }
46     }
47 }
1     int array[] = {23,43,2,35,534,645,4,56,45,65,75,45,3,57,64};
2     heapSort(array, sizeof(array)/sizeof(int));

 

posted @ 2016-03-25 17:07  颜妍  阅读(257)  评论(0编辑  收藏  举报