堆排序-c++实现,节点变动则递归子树调整状态

来源:互联网 发布:中国联合网络通信市分 编辑:程序博客网 时间:2024/06/01 09:06

伪代码在算法导论,其他不多说

#include "stdafx.h"#include <iostream>using namespace std;#define i_max_size sizeof(iArrList)/sizeof(iArrList[0])//构建大根堆void BuildMaxHeap(int iArrList[] ,int iArrSize,int index){//原数组,大小,节点编号int iLeftIndex = 2*index + 1;//数组下标从0开始int iRightIndex = 2*index + 2;int largest = index;if((iRightIndex < iArrSize) ){//在建立大根堆时,如果父节点比两个子节点都小,则交换最大的一个子节点if((iArrList[iLeftIndex] < iArrList[iRightIndex])){largest = iRightIndex;}else{largest = iLeftIndex;}}else{if(iLeftIndex < iArrSize){largest = iLeftIndex;}}if((iArrList[index] < iArrList[largest]) && (largest != index)){iArrList[index] ^= iArrList[largest];iArrList[largest] ^= iArrList[index];iArrList[index] ^= iArrList[largest];//如果交换了某个节点的值,则需要递归交换其子树的节点BuildMaxHeap(iArrList,iArrSize,largest);}}void HeapSort(int iArrList[],int iArrSize){if(iArrSize < 0){return ;}for(int i=0;i<iArrSize;i++){for(int j = ((iArrSize - i)/2-1);j>=0;j--){//从最后一个孩子的父节点开始BuildMaxHeap(iArrList,iArrSize - i,j);}int tmp = iArrList[0];iArrList[0] = iArrList[iArrSize -1 - i];iArrList[iArrSize -1 - i] = tmp;/*iArrList[0] ^= iArrList[iArrSize -1 - i];iArrList[iArrSize -1 - i] ^= iArrList[0];iArrList[0] ^= iArrList[iArrSize -1 - i];*/for(int i=0;i<iArrSize;i++){cout<<iArrList[i]<<" ";}cout<<endl;}return ;}int main(){int iArrList [] ={16,14,10,8,7,9,3,2,4,1};HeapSort(iArrList,i_max_size);return 0;}


原创粉丝点击