堆排序:
什么是堆?
最大堆:根结点的键值是所有堆结点键值中最大者的堆。
最小堆:根结点的键值是所有堆结点键值中最小者的堆。
(1) 基本思想 (需要会手动进行堆排序操作)
1. 构建堆;
2. 取堆得顶部元素,调整堆;
(2)代码
void heap_sort(int data[],int count)
{
int current;
int last_unsorted;
build_heap(data,count);
for(last_unsorted = count - 1; last_unsorted > 0;last_unsorted--)
{
current = data[last_unsorted]; //意义:删除堆中最后一个节点
data[last_unsorted] = data[0]; //移出堆顶到顺序表(从后到前存放)
insert_heap(data,current,0,last_unsorted - 1); //将之前堆中最后一个节点插入,维护堆性质
}
}
void build_heap(int data[],int n)
{
int root; //堆树的根位置
for(root = n/2 - 1;root>=0;root--)
{
int current = data[root];
insert_heap(data,current,root,n-1);
}
}
void insert_heap(int data[],int current,int root,int high)
{
int large; //large表示current应该插入的位置
large = 2*root + 1;
while(large <= high)
{
if(large < high && data[large] < data[large + 1]) //先选择左右孩子较大一个。
large++;
if(current >= data[large]) //如:current大,则插入的节点应该加到root位置.
break;
else //否则把两个孩子中较大者上移,再循环比较
{
data[root] = data[large];
root = large;
large = 2*root + 1;
}
}
data[root] = current;
}
(3)堆排序性能:
最好时间O(nlogn) 平均时间O(nlogn) 最坏时间O(nlogn) 稳定性--不稳定