堆排序学习笔记

1. 堆排序分为建堆和排序两大步骤

2. 堆排序中最为关键的一个算法就是堆的调整算法

3. 排序通常使用的数据结构是线性表,其好处在于可以通过对索引变量的计算来定位某个节点

4.对于数组A[1:length]中的A[i],其父节点为A[(i-1)/2],左子节点为A[i*2],右子节点为A[i*2+1]。

5. 堆其实是一个完全二叉树,只有最底两层的节点才可能是叶节点,堆中任意一个非叶节点的值必然大于其子节点的值

6. 建堆的过程就是从靠近底层最右边的一个非叶节点开始,向堆顶靠近,逐个非叶节点调用堆的调整算法。

7. 排序就是每次将堆顶的值取出,将最后一个叶节点的值赋给堆顶,以此堆的节点数量减一,然后对堆顶节点调用调整算法

8. 直到堆的节点只剩下一个时,排序就已经完成了.

 1 void maxHeapify(int *p,int size,int current)
 2 {
 3     int left=2*current+1;
 4     int right=2*current+2;
 5     int largest;
 6 
 7     if (left<size&&p[left]>p[current])
 8         largest=left;
 9     else
10         largest=current;
11     if(right<size&&p[right]>p[largest])
12         largest=right;
13 
14     if(largest!=current)
15     {
16         swap(p[current],p[largest]);
17         maxHeapify(p,size,largest);
18     }
19 }
20 
21 void buildMaxHeap(int *p,int size)
22 {
23     for (int i=(size-1)/2;i>=0;i--)
24         maxHeapify(p,size,i);
25 }
26 
27 void heapSort(int *p,int size)
28 {
29     buildMaxHeap(p,size);
30     for (int i=size-1;i>0;i--)
31     {
32         swap(p[i],p[0]);
33         maxHeapify(p,i,0);
34     }
35 }

posted on 2012-07-11 10:27  edward1992  阅读(118)  评论(0)    收藏  举报

导航