#include<bits/stdc++.h>
using namespace std;
/*
堆排序应该是理解上最简单的了。如何提升空间利用率是堆排序的关键。
对于正常的思路,把数组建堆,然后取出堆顶保存就可以,但是这样做的话需要单独开辟一块和数据规模同样大小的空间用以保存数据
如下方法可以不开辟内存达到排序的效果
假设升序排序构建的堆如下: 9
8 6
3
把3和9调换位置,得到: 3
8 6
9
对前三个数据建堆: 8
3 6
9
把8和6调换位置: 6
3 8
9
对前两个数据建堆: 6
3 8
9
把6和3调换位置: 3
6 8
9
只剩一个数据时不需要再建堆,此时已完成排序
但是建堆这一步可以使用对堆顶向下过滤来解决,因为除了堆顶所在的树,其他的树都是堆
*/
/*
大于号建最小堆,小于建最大堆
*/
bool cmp(int e1, int e2){ return e1 < e2; }
void swap(int &e1, int &e2)
{
int temp = e1;
e1 = e2;
e2 = temp;
}
//n是数组中元素的个数
void adjustDown(int *arr, int n)
{
int p, c, data = arr[0];
for(p = 0; p * 2 + 1 < n; p = c)
{
c = p * 2 + 1;
if(c != n - 1 && arr[c] < arr[c + 1])
c++;
if(data >= arr[c])
break;
else
arr[p] = arr[c];
}
arr[p] = data;
}
void heapSort(int *arr, int len)
{
make_heap(&arr[0], &arr[len], cmp);
for(int i = 0; i < len - 1; i++)
{
adjustDown(arr, len - i);
swap(arr[0], arr[len - i - 1]);
}
}
int main()
{
int arr[11] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
// int arr[11] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
heapSort(arr, 10);
for(int i = 0; i < 10; i++)
cout << arr[i] << " ";
return 0;
}
堆排序
最新推荐文章于 2024-06-09 16:03:45 发布
