#include <stdio.h>
/*遍历*/
void tranvase(int * arr, int len){
int i;
for(i=1; i<=len; i++){
printf("%d、", arr[i]);
}
printf("\n");
}
/*调整堆*/
void tiaozhengdui(int * arr, int root, int end){ //root 为根坐标 end为最后元素坐标
int j;
j = 2*root; //root的左子树
int temp = arr[root]; //临时保存根节点值
/*比较左子树值和右子树值*/
if((j+1)<=end && arr[j]<arr[j+1]){
j=j+1;
}
//j 指向子树最大值的位置
// 继续比较 该最大值 和 它的 子树值进行比较
while(j<=end){
if(temp<arr[j]){ //根节点值<子树最大值 互换值
arr[root] = arr[j];
root = j;
j = 2*j;
/*比较左子树值和右子树值*/
if((j+1)<=end && arr[j]<arr[j+1]){
j=j+1;
}
}else{
j = end+1; //退出
}
}
arr[root] = temp;
}
/*堆排序*/
void stackSort(int * arr, int len){
int i,j,temp;
//初始化堆
for(i=len/2; i>=1; i--){
tiaozhengdui(arr, i, len);
}
/*换根和最后元素的值*/
for(j=len; j>=2; j--){
temp = arr[1]; //临时存储根节点最大值
arr[1] = arr[len]; //根节点保存最后一个结点的值
arr[len]=temp; //最后一个结点保存最大值
len = len-1;
tiaozhengdui(arr, 1, len); //继续调整堆
}
}
int main(){
int arr[10] = { 0, 12, 1, 33, 23, 23, 4, 2, 445, 2};
tranvase(arr, 9);
stackSort(arr, 9);
tranvase(arr, 9);
return 0;
}