堆排序学习笔记
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) 收藏 举报
浙公网安备 33010602011771号