堆排序 HeapSort
基于简单选择排序算法,属于选择排序类算法
属于:改进算法
平均:O(nlogn) 最好:O(nlogn) 最坏:O(nlogn)
稳定性:不稳定
辅助空间:O(1)
数据结构:堆(其实就是一种特殊的完全二叉树),可以利用数组实现这棵树
大顶堆:每个结点的值都大于或等于其左右孩子结点的值
小顶堆:每个结点的值都小于或等于其左右孩子结点的值
存储:数组实现,从上到下,从左右到依次存到数组中(完全二叉树就是爽)
堆排序思想:(大顶堆 -- > 升序)
将待排序的序列构造成一个大顶堆。此时,整个序列的最大值就是堆顶的根结点。将它移走(将其与堆数组的末尾元素交换,此时末尾元素就是最大值),然后将剩余的n-1个序列重新构造一个堆,这样就会得到n个元素中的次大值,反复执行,得到有序序列
空间复杂度来说:只用了一个用来交换的单元,很不错的,就地排序O(1)
由于初始构建堆的比较次数比较多,所以,并不适合待排序序列个数不多的情况!
说了这么多了,来点干货!下面是用C++实现的基于大顶堆的升序排序算法。
void heap_sort(int *a, int len)
{
for(int i=len/2; i >= 0; i--)
{
heap_adjust(a,i,len-1);
}
for(int i=len-1; i > 0; i--)
{
int temp = a[0];
a[0] = a[i];
a[i] = temp;
heap_adjust(a, 0, i-1);
}
}
void heap_adjust(int *a, int s, int m)
{
int temp = a[s];
for(int i=2*s+1; i <= m; i = i*2+1)
{
if(i < m && a[i] < a[i+1])
i++;
if(a[i] < temp)
break;
a[s] = a[i];
s = i;
}
a[s] = temp;
}