今天学了个堆排序,学得有点郁闷,感觉反正挺乱的,然后自己看着大神的代码敲了敲,遇到好多问题,然后改过来了。不知道真正运用的时候能不能写得合格
#include<iostream>
#define N 500
using namespace std;
int num[N];
int n;
//i就表示从i往下的,调整成一个堆
void DeleteHeap(int n,int i) {
int j=2*i+1,temp=num[i];
while(j<n) {
//找子节点里较小的那个
if(j+1<n && num[j+1]<num[j])
j++;
if(num[j]>temp) break;
num[i]=num[j];
//往下推
i=j;
j=2*j+1;
}
num[i]=temp;
}
void InsertHeap(int ele) {
int i=n,j=(n-1)/2;//j为i的父节点下标
num[n++]=ele;
int temp=num[i];
while(i!=0 && j>=0) {
if(temp>=num[j]) break;
num[i]=num[j];
i=j;
j=(j-1)/2;
}
num[i]=temp;
}
void MakeHeap(int n) {
//i从n/2-1开始是因为叶子节点都算是已经排好的小堆,只需要从非叶子节点开始就可以
for(int i=n/2-1; i>=0; i--)
DeleteHeap(n,i);
}
void HeapSort() {
//就是将堆顶的元素与最后一个元素交换,再对排第一个元素到剩下的元素堆排,然后继续放到最后
for(int i=n-1; i>0; i--) {
swap(num[0],num[i]);
DeleteHeap(i,0);
}
}
int main() {
cin>>n;
for(int i=0; i<n; i++)
cin>>num[i];
for(int i=0; i<n; i++)
cout<<num[i]<<' ';
cout<<endl;
//删除
swap(num[0],num[n-1]);
DeleteHeap(n-1,0);
n--;
for(int i=0; i<n; i++)
cout<<num[i]<<' ';
cout<<endl;
//插入
InsertHeap(4);
for(int i=0; i<n; i++)
cout<<num[i]<<' ';
cout<<endl;
//堆排序
MakeHeap(n);
HeapSort();
for(int i=0; i<n; i++)
cout<<num[i]<<' ';
cout<<endl;
return 0;
}