堆排序的代碼實現

利用大頂堆(小頂堆)的根節點記錄最大數值(最小數值)的特性,可以對數值進行排序

現以大頂堆的基本思想爲例:
1、將int 數組arr[1,…,n]構造爲大頂堆,實現函數爲heapadjust();
2、可得大頂堆的根節點,即arr[1]的數值爲最大數值,然後將該值與arr[n]互換。
3、對數組arr[1,…,n-1]構造爲大頂堆並將arr[1]與arr[n-1]互換,直到n-1爲2停止互換,堆排序完成。
對於堆排序,最重要的兩個操作就是構造大頂堆和調整堆,其實構造初始堆事實上也是調整堆的過程。

實現代碼:

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


//對當前節點進行調整,這樣得到一個大頂堆
void heapadjust(int k[],int n)
{
    int i,temp=0;
    for(i=n/2;i>0;i--)
    {
        if(k[i]<k[2*i+1] && (2*i+1)<=n)
        {
            temp = k[i];
            k[i] = k[2*i+1];
            k[2*i+1] = temp;
        }
        if(k[i]<k[2*i] && 2*i<=n)
        {
            temp = k[i];
            k[i] = k[2*i];
            k[2*i] = temp;
        }
    }
}

//將堆排序後數組的根節點和最後一個節點的值互換
void swap(int k[],int i,int j)
{
    int temp = k[i];
    k[i] = k[j];
    k[j] = temp;
}

//堆排序
void heapsort(int k[], int n)
{
    int i =n/2;
    heapadjust(k,n);
    //將本次根節點的數值和最後的葉子節點互換,然後排序的數據減1,找到減一後的最大數值,再和倒數第二個節點互換
   for(i=n;i>=1;i--)
   {
       swap(k,1,i);
       heapadjust(k,i-1);
   }
}

int main()
{
    //堆排序,採用二叉樹結構,所以下標從1開始
    int arr[10]={-1,45,68,29,10,95,978,2,3,9};
    heapsort(arr,9);
    int i=0;
    printf("排序後的結果是:\n");
    for(i=1;i<10;i++)
    {
       printf("%d\t",arr[i]);
    }
    return 0;
}

結果:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章