描述
将需要排序的数组用构造成最大堆的算法进行原地排序。
具体思路
- 对于传入的数组arr[0…n-1],从第
(n-1-1)/2
个元素(即最后一个非叶子结点)开始往前进行堆化,构造成最大堆。 - 这样一来arr[0]为最大元素。设定一个索引
i = n-1
交换arr[0]和arr[i],就把最大值放到了最后,同时对arr[0…i-1]进行堆化(只需要总0开始)。 - 再让i - -,重复上一步,直到 i == 0 退出。
实现代码
#include<bits/stdc++.h>
using namespace std;
//对最大堆从上往下进行调整
template<typename T>
void shiftDown(T arr[], int n, int v) {
T temp = arr[v];
//有子节点执行循环
while(2*v+1 < n) {
int j = 2*v+1;
//左右子节点比较
if(arr[j] < arr[j+1] && j+1 < n)
j += 1;
//大于或等于最大子节点
if(temp >= arr[j])
break;
arr[v] = arr[j];
v = j;
}
arr[v] = temp;
}
template<typename T>
void heapSort(T arr[], int n) {
//最后一个元素的索引n-1
//索引-1再除2,得到父结点
for(int i = (n-1-1)/2; i >= 0; i--) {
shiftDown(arr, n, i);
}
for(int i = n-1; i > 0; i--) {
//把最大元素放在最后
swap(arr[0], arr[i]);
//整理堆,对arr[0...i-1]进行整理
shiftDown(arr, i, 0);
}
}
int main(int argc, char const *argv[])
{
//测试
int arr[10] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
heapSort(arr, 10);
for(int i = 0; i < 10; i++) {
printf("%d ", arr[i]);
}
return 0;
}
最后
- 由于博主水平有限,难免有疏漏之处,欢迎读者批评指正!