排序算法--堆排序C語言


算法思想:1.將長度為n的待排序的數組進行堆有序化構造成一個大頂堆

2.將根節點與尾節點交換並輸出此時的尾節點

3.將剩余的n -1個節點重新進行堆有序化

4.重復步驟2,步驟3直至構造成一個有序序列

代碼:

#include <stdlib.h>
#include <stdio.h>

void swap(int K[], int i, int j)
{
    int temp = K[i];
    K[i] = K[j];
    K[j] = temp;
}
void HeapAdjust(int k[], int p, int n)
{
    int i, temp;
    temp = k[p];
    for (i = 2 * p; i <= n; i *= 2)    //逐漸去找左右孩子結點
    {
        //找到兩個孩子結點中最大的
        if (i < n && k[i] < k[i + 1])
            i++;
        //父節點和孩子最大的進行判斷,調整,變為最大堆
        if (temp >= k[i])
            break;
        //將父節點數據變為最大的,將原來的數據還是放在temp中,
        k[p] = k[i];    //若是孩子結點的數據更大,我們會將數據上移,為他插入的點提供位置
        p = i;
    }
    //當我們在for循環中找到了p子樹中,滿足條件的點,我們就加入數據到該點p,注意:p點原來數據已經被上移動了
    //若沒有找到,就是相當於對其值不變
    //插入
    k[p] = temp;
}

//大頂堆排序
void HeapSort(int k[], int n)
{
    int i;
    //首先將無序數列轉換為大頂堆
    for (i = n / 2; i > 0; i--)    //注意由於是完全二叉樹,所以我們從一半向前構造,傳入父節點
        HeapAdjust(k, i, n);

    //上面大頂堆已經構造完成,我們現在需要排序,每次將最大的元素放入最后
    //然后將剩余元素重新構造大頂堆,將最大元素放在剩余最后
    for (i = n; i > 1; i--)
    {
        swap(k, 1, i);
        HeapAdjust(k, 1, i - 1);
    }
}


int main()
{
    int i;
    int a[11] = { -1, 5, 2, 6, 0, 3, 9, 1, 7, 4, 8 };
    HeapSort(a, 10);

    for (i = 1; i <= 10; i++)
        printf("%d ", a[i]);

    system("pause");
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM