堆排序
堆排序是一种选择排序,其最好,最坏,平均时间复杂度均为O(nlogn),是一种不稳定的排序。
首先我们来认识一下堆的结构。
对于大顶堆,其根节点的值要大于左右孩子,小顶堆则相反。那么我们可以利用满二叉树的性质,用数组来存储堆结构。i是根节点,则左右孩子为2*i和2*i+1
堆排序的算法顺序如下:
1 首先建立初始大根堆。从第一个非叶子节点开始,不断调用调整堆函数。最终我们构建出一颗初始大顶堆。
2 交换a[1]待调整堆的最后一个元素i,然后对于1到i-1进行调整堆算法。重复执行n次即可。
#include<iostream> #include<cstdio> using namespace std; int a[110],n; void adjheap(int pos,int n) { int key=a[pos]; for(int i=pos*2;i<=n;i=i*2) { if(i<n&&a[i]<a[i+1]) i++; if(key<a[i]) { a[pos]=a[i]; pos=i; } else break; } a[pos]=key; } void sort() { for(int i=n/2;i>=1;i--) adjheap(i,n); for(int i=n;i>1;i--) { swap(a[1],a[i]); adjheap(1,i-1); } } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); sort(); for(int i=1;i<=n;i++) printf("%d ",a[i]); }