大根堆排序
2013-10-07 15:09
344 查看
建立大根堆,处于堆顶的元素heap[0],则是最大的数,将这个heap[0]与最后一个元素交换,即与heap[n-1],交换,则最大的数被到了最后,再对heap[0]与heap[n-2]这些数根据大根堆调整,这些最大数又被调整到了heap[0],再将heap[0]与heap[n-2]对换,对heap[0]与heap[n-3大根堆调整
typedef struct minHeapMax{ int heap[40]; int currentSize; }; //i是调节第几个关键字,m是堆的大小 void siftDownMax(minHeapMax &H ,int i,int m){ int j=0; int temp = H.heap[i]; H.currentSize = m; j = 2*i+1; while(j<m){ if(j<m-1&&H.heap[j]<H.heap[j+1]) j = j+1; if(temp<H.heap[j]){ H.heap[i] = H.heap[j]; i = j; j = 2*j+1; }else break; } H.heap[i] = temp; } void createBigHeap(minHeapMax &H,int A[],int n){ int i=0; H.currentSize = n; for(i=0;i<n;i++){ H.heap[i] = A[i]; } int currentPos = (H.currentSize-1)/2; while(currentPos>=0){ siftDownMax(H,currentPos,H.currentSize); currentPos--; } } void main(){ minHeapMax H; int temp; int i=0; int A[8] = {49,38,65,97,76,13,27,49}; createBigHeap(H,A,8); for(i=0;i<8;i++){ printf("%d \n " ,H.heap[i]); } while(H.currentSize>0){ temp = H.heap[H.currentSize-1]; H.heap[H.currentSize-1] = H.heap[0]; H.heap[0] = temp; H.currentSize--; siftDownMax( H ,0, H.currentSize); } for(i=0;i<8;i++){ printf("%d \n " ,H.heap[i]); } }
相关文章推荐
- 堆排序—大根堆,小根堆
- 大根堆排序结果为升序
- 【数据结构-排序】大根堆的建立
- 堆排序原理及算法实现(大根堆)
- 堆排序原理及算法实现(大根堆)
- 将二叉树调整成大根堆,之后排序
- 排序——堆排序-大根堆(大顶堆)
- 在C#中实现对ListView点击列标题自动排序功能
- 霍尔快速排序 非递归 C++实现
- orcale实现自定义优先级排序的SQL
- php数组排序
- Linux Shell 文件的排序、合并和分割
- 贪心 --- 排序 + 贪心
- 《算法导论》之:插入排序
- 重新教自己学算法之递归排序——合并排序(五)
- 九度OJ 1202:排序 (排序)
- 根据 button 的tag值将button排序
- 堆排序
- 第十五周项目一(4)快速排序
- 快速排序1