C語言-資料結構-堆排序(heap sort)-原始碼__資料結構

來源:互聯網
上載者:User

1. 堆排序

堆排序的定義及思想可以參考百度百科:堆排序

用一句概括,堆排序就是一種改進的選擇排序,改進的地方在於,每次做選擇的時候,不單單把最大的數字選擇出來,而且把排序過程中的一些操作進行了記錄,這樣在後續排序中可以利用,並且有分組的思想在裡面,從而提高了排序效率,其效率為O(n*logn).


2. 原始碼

堆排序中有兩個核心的操作,一個是建立大頂堆(或者小頂堆,這裡用的是大頂堆),再一個就是對堆進行調整。這裡需要注意的是,並沒有真正的建立堆,只是利用完全二叉樹的特性,將其對應到數組的下標中(例如對於節點i,如果其存在左孩子和右孩子,那麼其下標一定是2*i, 和2*i+1)其中建立的時候是從下向上建立,而調整則是從上向下調整。

這裡為了方便,堆從a[1]位置開始。

代碼運行結果如下:



原始碼如下:

 
#include<stdio.h>int c=0;/*heapadjust()函數的功能是實現從a[m]到a[n]的資料進行調整,使其滿足大頂堆的特性*//*a[]是待處理的數組,m是起始座標, n是終止座標*/void heapadjust(int a[], int m, int n){    int i, temp;    temp=a[m];    for(i=2*m;i<=n;i*=2)//從m的左孩子開始    {        if(i+1<=n && a[i]<a[i+1])//如果左孩子小於右孩子,則將i++,這樣i的值就是最大孩子的下標值        {            i++;        }        if(a[i]<temp)//如果最大的孩子小於temp,則不做任何操作,退出迴圈;否則交換a[m]和a[i]的值,將最大值放到a[i]處        {            break;        }        a[m]=a[i];        m=i;    }    a[m]=temp;}void crtheap(int a[], int n)//初始化建立一個大頂堆{    int i;    for(i=n/2; i>0; i--)//n/2為最後一個雙親節點,依次向前建立大頂堆    {        heapadjust(a, i, n);    }}/*swap()函數的作用是將a[i]和a[j]互換*/void swap(int a[], int i, int j){    int temp;    temp=a[i];    a[i]=a[j];    a[j]=temp;    c++;}void heapsort(int a[], int n){    int i;    crtheap(a, n);    for(i=n; i>1; i--)    {        swap(a, 1, i);//將第一個數,也就是從a[1]到a[i]中的最大的數,放到a[i]的位置        heapadjust(a, 1, i-1);//對剩下的a[1]到a[i],再次進行堆排序,選出最大的值,放到a[1]的位置    }}int main(void){    int i;    int a[10]={-1,5,2,6,0,3,9,1,7,4};    printf("排序前:");    for(i=1;i<10;i++)    {        printf("%d",a[i]);    }    heapsort(a, 9);    printf("\n\n共交換資料%d次\n\n", c);    printf("排序後:");    for(i=1;i<10;i++)    {        printf("%d",a[i]);    }    printf("\n\n\n");    return 0;}


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.