#include<iostream>
#include<algorithm>
#define MaxSize 6//这里单纯指个数
#define INF 0x7fffffff
using namespace std;
int num[MaxSize+1]={INF,5,7,2,3,14,10};//从1开始存,后面比较好算父子节点位置
void HeapInsert(){//只用于构建插入 //新插入的数上升
for(int i=1;i<MaxSize+1;i++){
int currentIndex = i;//当前索引
int fatherIndex = currentIndex / 2; //第一,当i等于1时num[0]参入到排序中,大根堆就把num[0]设计成无穷大,就不会动;第二,(currentIndex - 1) / 2;即从num[0]开始存,会出现负数,需要特判
while (num[currentIndex] > num[fatherIndex]){//因为理解性的原因和之后currentIndex要发生改变,所以不能用i,i只做遍历作用
swap(num[currentIndex],num[fatherIndex]);
currentIndex=fatherIndex;
fatherIndex=fatherIndex/2;
}
}
}
void Heapify(int index,int size){//index是要调整的数的位置,size代表调整的末尾
int left=2*index;
int right=2*index+1;
while(left<size){//为什么用left有待商榷 //或right<=size
int largestIndex;//求较大值的索引
if(num[left]<num[right]&& right < size) largestIndex=right;
else largestIndex=left;
if(num[index]>num[largestIndex]) largestIndex=index;//不直接退出是因为这一段就是求 largestIndex,保持程序的连贯性
//如果父结点索引是最大值的索引,那已经是大根堆了,则退出循环
if (index == largestIndex) {
break;
}//退出开关
swap(num[index],num[largestIndex]);
index=largestIndex;//循环进行下一轮
left=2*index;
right=2*index+1;
}
}
void HeapSort(){//整体函数调用
HeapInsert();
int _size=MaxSize;
while(_size>1){//剩下一个自动有序
swap(num[1],num[_size]);
_size--;
Heapify(1,_size);
}
}
int main(void){
HeapSort();
for(int i=1;i<MaxSize+1;i++) cout<<num[i]<<" ";
return 0;
}
09-21
1723
11-15
1044