ppt(原创):
https://files.cnblogs.com/files/eastblue/%E5%A0%86%E6%8E%92%E5%BA%8F.pptx
视频(原创):
https://www.bilibili.com/video/av16199074/
代码:
#include<cstdio> #include<cstring> const int maxn=1e9+7; int b[50050]; void fun(int a[],int i)//a数组i节点完成操作 { int l=sizeof(a),t; while(2*i+1<l) { t=a[i]; if(2*i+2<l)//有两个孩子节点 { if(a[2*i+1]<=a[2*i+2]&&a[2*i+1]<a[i]) //与左孩子交换 { a[i]=a[2*i+1]; a[2*i+1]=t; i=2*i+1; } else if(a[2*i+2]<a[2*i+1]&&a[2*i+2]<a[i])//与右孩子交换 { a[i]=a[2*i+2]; a[2*i+2]=t; i=2*i+2; } else break; } else//只有一个孩子节点 { if(a[2*i+1]<a[i]) { a[i]=a[2*i+1]; a[2*i+1]=t; i=2*i+1; } else break; } } } void heapsort(int a[]) { int l=sizeof(a); for(int i=(l-2)/2;i>=0;i--)//数组从0开始,所以从(l-2)/2开始’筛选‘,(对应ppt第二步) { fun(a,i); } for(int i=1;i<=l;i++)//(对应ppt第三步) { b[i-1]=a[0]; a[0]=a[l-i]; a[l-i]=maxn; fun(a,0); } for(int i=0;i<l;i++) a[i]=b[i]; } int main() { int array[8]={49,38,65,97,76,13,27,49}; heapsort(array); for(int i=0;i<8;i++) printf("%d ",array[i]); }