堆排序过程:
9, 79, 46, 30, 58, 49
堆排序n/2向上取整,就是舍弃小数
堆:完全二叉树,O(nlogn),O(1)
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define N 10
using namespace std;
void adjust(int arr[], int N, int i)
{
int l = 2*i + 1;
int r = 2*i + 2;
int max = i; //最大结点下标
if(l<N && arr[l] > arr[max]) max = l;
if(r<N && arr[r] > arr[max]) max = r; // max是3个数中最大数的下标
if(max != i) // 如果max的值有更新
{
swap(arr[max], arr[i]);
adjust(arr, N, max); // 递归调整其他不满足堆性质的部分
}
}
void heapSort(int arr[], int N)
{
for(int i=N/2 - 1; i >= 0; i--) // 对每一个非叶结点进行堆调整(从最后一个非叶结点开始)
{
adjust(arr, N, i);
}
for(int i = N - 1; i >= 1; i--)
{
swap(arr[0], arr[i]); // 将当前最大的放置到数组末尾
adjust(arr, i, 0); // 将未完成排序的部分继续进行堆排序
}
}
int main()
{
int arr[N];
srand(time(0)); //设置随机化种子,避免每次产生相同的随机数
for (int i = 0; i < N; i++)
arr[i] = rand() % 101; //数组赋值使用随机函数产生1-100之间的随机数
heapSort(arr, N);
for(auto it: arr)
cout<<it<<endl;
return 0;
}