堆排序
听到这个就又开始头痛了。堆排序,顾名思义,用堆进行的排序。
但实际上,只要知道了具体的做法,堆排序并不难。
堆排序的困难在于建立最大堆(这里用最大堆为例)
直接上图
5比自己的子节点要小,故要移位
又发现5还是比字节点要小,所以接着换
像这样逐步得到最大堆
最大堆设置完毕,就要开始进行堆排序。
1. 将堆的顶部,与最后一个元素交换。
2. 再将剩下的元素进行上述操作,调整为最大堆。
3. 调整完毕,继续将最大元素与最后一个元素交换。
4. 如此类推,直至排序完成
上代码
#include <iostream>
using namespace std;
void cmp_Heap(int* a, int node, int size)
{
int left = 2 * node + 1; //左子树
int right = 2 * node + 2; //右子树
int max = node;
if (left<size && a[left]>a[max])
max = left;
if (right<size && a[right]>a[max])
max = right;
if (max != node)
{
swap(a[max], a[node]);
cmp_Heap(a, max, size);
}
}
void Heap_Sort(int* a, int len)
{
for (int i = len / 2 - 1; i >= 0; --i)
cmp_Heap(a, i, len);
for (int i = len - 1; i >= 0; i--)
{
swap(a[0], a[i]); // 将当前最大的放到数组最后
cmp_Heap(a, 0, i); // 将未排序的部分进行堆排序
}
}
int main()
{
int data[10] = { 1,23,89,-65,-88,0,54,85,300,-100 };
int len = sizeof(data) / sizeof(int);
cout << "排序前" << endl;
for (int i = 0; i < len; i++)
cout << data[i] << " ";
cout << endl;
Heap_Sort(data, len);
cout << "堆排序后:" << endl;
for (int i = 0; i < len; i++)
cout << data[i] << " ";
return 0;
}