伪代码在算法导论,其他不多说
#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;
}