const int N = 100; int a[N]; int n; void adjust(int low,int high){ for(int i=low;i<=high/2;){ int k=2*i;//k暂存较大的孩子节点的下标 if(2*i+1<=high&&a[2*i]<a[2*i+1]){ k=2*i+1; } if(a[k]>a[i]){ swap(a[k],a[i]); i=k; } else{ break; } } } void HeapSort(){ for(int i=n/2;i>=1;i--){ adjust(i,n); } for(int i=n;i>=1;i--){ swap(a[1],a[i]) adjust(1,i-1); } }
下标范围【1,n】都是闭区间
从下标2/n开始到下标1结束,每次都向下调整到叶子节点
每次排序之后把在下标1处的最大值调到数组尾部相应位置,共操作n次,每次调整需logn次,因而时间复杂度O(nlogn)。
堆排序(heap sort)
最新推荐文章于 2022-08-08 15:57:26 发布