#yyds干货盘点#算法给小码农堆排序至尊骨

Posted 模块师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#yyds干货盘点#算法给小码农堆排序至尊骨相关的知识,希望对你有一定的参考价值。

堆排序

升序

一种非常正常的想法 空间复杂度O(N)

堆升序函数HeapSort

//升序
void HeapSort(HPDataType* a,int n)

    HP hp;
    HeapInit(&hp);
    int i = 0;
    //建立一个小堆
    for (i = 0; i < n; i++)
    
        HeapPush(&hp, a[i]);
    
    //然后把堆顶的元素重新放到数组里面
    for (i = 0; i < n; i++)
    
        a[i] = HeapTop(&hp);
        //用完pop掉
        HeapPop(&hp);
    
    HeapDestroy(&hp);

堆排序测试函数

void testHeapSort()

    int a[] =  40,2,0,12,5,454,2323 ;
    //堆排序
    HeapSort(a, sizeof(a) / sizeof(a[0]));
    int i = 0;
    for (i = 0; i < sizeof(a) / sizeof(a[0]); i++)
    
        //把数组里面的元素取出来
        printf("%d ",a[i]);
    
    printf("\\n");

建堆(向上向下为建堆)

向上调整(建大堆)

==上面做法一点毛病都没有,但是有要求了,空间复杂度为O(1) 也就是我们不可以在用Heap了==

==看到上面打印的结果我们看到建的是小堆,但是不好的是最小的在下标为0的位置,再次找次小的,从下标为一的位置再构建,这是不行的,因为会破坏结构,所以我们要重头建大堆,然后收尾交换==

//真正玩法
void HeapSort(HPDataType* a, int n)

    assert(a && n>=0);
    //把数组a构建成堆
    int i = 0;
    for (i = 0; i < n; i++)
    
        AdjustUp(a,n,i);
    

交换排序&&再向上调整

堆排序代码
//真正玩法
void HeapSort(HPDataType* a, int n)

    assert(a && n>=0);
    //把数组a构建成堆
    int i = 0;
    //向上调整
    for (i = 0; i < n; i++)
    
        AdjustUp(a,i);
    
    //根与最后一个数交换并每次都找到次大的数
    int tail = n - 1;
    while (tail)
    
        Swap(&a[0], &a[tail]);//根与最后一个数交换
        tail--;
        for (i = 0; i <= tail; i++)
        
            AdjustUp(a, i);
        
       
堆排序测试
void testHeapSort()

    int a[] =  40,2,50,12,5,454,2323,;
    //堆排序
    HeapSort(a, sizeof(a) / sizeof(a[0]));
    int i = 0;
    for (i = 0; i < sizeof(a) / sizeof(a[0]); i++)
    
        //把数组里面的元素取出来
        printf("%d ",a[i]);
    
    printf("\\n");

向下调整

排升序 构建小堆

排升序 构建大堆

堆排序
//真正玩法
void HeapSort(HPDataType* a, int n)

    assert(a && n>=0);
    //把数组a构建成堆
    int i = 0;
    ////向上调整
    //for (i = 0; i < n; i++)
    //
    //  AdjustUp(a,n,i);
    //
    //向下调整
    for (i = (n - 1 - 1) / 2; i >= 0; i--)
    
        AdjustDown(a, n, i);
    
    //根与最后一个数交换并每次都找到次大的数
    int tail = n - 1;
    for (i = tail; i > 0; i--)
    
        Swap(&a[0],&a[i]);//根与最后一个数交换
        AdjustDown(a, i, 0);//向下调整每次都找到次大的数
       
测试堆排序
void testHeapSort()

    int a[] =  40,2,50,12,5,454,232,30,3,10 ;
    //堆排序
    HeapSort(a, sizeof(a) / sizeof(a[0]));
    int i = 0;
    for (i = 0; i < sizeof(a) / sizeof(a[0]); i++)
    
        //把数组里面的元素取出来
        printf("%d ",a[i]);
    
    printf("\\n");

降序

向上调整 (建小堆)

向下调整(建小堆)

建堆的时间复杂度

==所以时间复杂度是O(n)==

以上是关于#yyds干货盘点#算法给小码农堆排序至尊骨的主要内容,如果未能解决你的问题,请参考以下文章

#yyds干货盘点#算法给小码农冒泡排序铭纹,快速排序四极

#yyds干货盘点#算法给小码农二叉树OJ淬体

#yyds干货盘点#算法给小码农链式二叉树-----一根草可斩星辰

#yyds干货盘点#算法开启小码农双链表血脉

算法给小码农TopK重瞳双目

算法给小码农冒泡排序铭纹,快速排序四极