#include <iostream>
using namespace std;
#define Max 10
void Printarry(int arr[],int len){
for(int i = 0;i<len;i++){
cout<<arr[i]<<" ";
}
cout<<endl;
}
void Myswap(int arr[],int a,int b){
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
void Headadjust(int myarr[],int index,int len){
//先保存当前结点的下标
int max = index;
//保存左右孩子的数组下标
int lchild = index*2+1;//index从0开始
int rchild = index*2+2;
//左孩子为最大值
if(lchild < len && myarr[lchild] > myarr[max]){
max = lchild;
}
//右孩子为最大值
if(rchild < len && myarr[rchild] > myarr[max]){
max = rchild;
}
if(max != index){
//交换两个结点
Myswap(myarr,max,index);
Headadjust(myarr,max,len);
}
}
void Heapsort(int myarr[],int len){
//初始化堆
for(int i = len/2-1;i>=0;i--){
Headadjust(myarr,i,len);
}
cout<<myarr[0]<<endl;//第一个数最大
//交换堆顶元素和堆后元素
for(int i = len-1;i>=0;i--){
Myswap(myarr,0,i);
Headadjust(myarr,0,i);
}
}
int main(){
int myarr[]={4,2,8,0,5,7,1,3,9,6};
int len = sizeof (myarr)/sizeof (int);
Printarry(myarr,Max);
//堆排序
Heapsort(myarr,len);
Printarry(myarr,Max);
return 0;
}
堆排序的实现
最新推荐文章于 2025-08-04 22:37:45 发布