时间复杂度:O(n*logn)
特别适用于数据量很大的场合(百万级数据)。因为快排和归并排序都是基于递归的,数据量很大的
情况下容易发生堆栈溢出。
排序速度略低于快排。
也是一种不稳定的排序算法。比如 3 27 27 36,如果堆顶3先输出,则第三层(最后一个27)跑到堆顶,
然后堆稳定,继续输出堆顶,是刚才那个27, 这样说明后面的27先于第二个位置的27输出,不稳定。
#include <iostream>
using namespace std;
typedef struct SqList
{
int r[10] = {1,8,12,3,14,5,13,15,23,45};
int length = 9;
}SqList;
void m_swap(SqList *L ,int s ,int m)//s,m位置上的数进行转换
{
int temp = L -> r[s];
L -> r[s] = L -> r[m];
L -> r[m] = temp ;
}
void HeapAdjust(SqList *L , int s , int m)//大顶堆
{
int temp ,j;
temp = L -> r[s];
for( j = 2 * s ;j <= m; j *= 2)//沿关键字较大的孩子结点向下筛选
{
if(j < m && L->r[j] < L->r[j + 1])
++j;//j为关键字中较大的记录下标
if(temp >= L->r[j])
break;
L->r[s] = L->r[j];
s = j;
}
L->r[s] = temp;//插入
}
void HeapSort(SqList *L)
{
int i;
for(i = L->length / 2; i > 0; i--)
HeapAdjust(L , i , L->length);//把L构建成一个大顶堆
for(i = L->length; i > 1; i--)
{
m_swap(L,1,i);//将堆顶记录于最后一个记录交换
HeapAdjust(L, 1 ,i - 1);//重新调整大顶堆
}
}
int main()
{
SqList L;
for(int i = 0; i < 10; i++)
{
cout << L.r[i] << " ";
}
cout << endl;
HeapSort(&L);
for(int i = 0; i < 10; i++)
{
cout << L.r[i] << " ";
}
cout << endl;
}