堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种,
它是
通过堆来进行选择数据。
需要注意的是排升序要建大堆,排降序建小堆。
大堆模拟实现(示例)
void _AdjustDownByHeapSort(int *ar, int left, int right, int start)
{
int n = right - left;
int i = start;
int j = 2 * i + 1; //左子树
int tmp = ar[i];
while(j < n)
{
if(j+1<n && ar[j+1]>ar[j]) //有右子树选取左右子树较大的数
j++;
if(tmp < ar[j])
{
ar[i] = ar[j];
i = j; //向下
j = 2 * i + 1;
}
else
break;
}
ar[i] = tmp;
}
void HeapSort(int *ar, int left, int right)
{
//建堆
int n = right - left;
int curpos = n/2 - 1 + left;
while(curpos >= left)
{
_AdjustDownByHeapSort(ar,left, right, curpos);
curpos--;
}
//排序
int end = right - 1;
while(end > left)
{
Swap(&ar[left], &ar[end]);
_AdjustDownByHeapSort(ar, left, end, left); //除去最后一个
end--;
}
}
1.
堆排序使用堆来选数,效率就高了很多。(选择过程当中,会将上次选择的结果做一个记录,并不是所有的数据参与选择)
2.
时间复杂度:
O(N*logN)
3.
空间复杂度:
O(1)
4.
稳定性:不稳定