堆排序是一种怎么样的体验

时间复杂度:O(n*logn)
特别适用于数据量很大的场合(百万级数据)。因为快排和归并排序都是基于递归的,数据量很大的
情况下容易发生堆栈溢出。
排序速度略低于快排。
也是一种不稳定的排序算法。比如 3 27 27 36,如果堆顶3先输出,则第三层(最后一个27)跑到堆顶,
然后堆稳定,继续输出堆顶,是刚才那个27, 这样说明后面的27先于第二个位置的27输出,不稳定。

#include 
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;

}

你可能感兴趣的:(C语言,C++,算法总结)