C語言對堆排序一個算法思路和實現(xiàn)代碼
算法思想簡單描述:
堆排序是一種樹形選擇排序,是對直接選擇排序的有效改進(jìn)。
堆的定義如下:具有n個元素的序列(h1,h2,...,hn),當(dāng)且僅當(dāng)滿足(hi>=h2i,hi>=2i+1)或(hi<=h2i,hi<=2i+1)(i=1,2,...,n/2)時稱之為堆。在這里只討論滿足前者條件的堆。
由堆的定義可以看出,堆頂元素(即第一個元素)必為最大項。完全二叉樹可以很直觀地表示堆的結(jié)構(gòu)。堆頂為根,其它為左子樹、右子樹。
初始時把要排序的數(shù)的序列看作是一棵順序存儲的二叉樹,調(diào)整它們的存儲順序,使之成為一個堆,這時堆的根節(jié)點(diǎn)的數(shù)最大。然后將根節(jié)點(diǎn)與堆的最后一個節(jié)點(diǎn)交換。然后對前面(n-1)個數(shù)重新調(diào)整使之成為堆。依此類推,直到只有兩個節(jié)點(diǎn)的堆,并對它們作交換,最后得到有n個節(jié)點(diǎn)的有序序列。
從算法描述來看,堆排序需要兩個過程,一是建立堆,二是堆頂與堆的最后一個元素交換位置。所以堆排序有兩個函數(shù)組成。一是建堆的滲透函數(shù),二是反復(fù)調(diào)用滲透函數(shù)實現(xiàn)排序的函數(shù)。
堆排序是不穩(wěn)定的。算法時間復(fù)雜度O(nlog2n)。
void sift(int *x, int n, int s){ int t, k, j; t = *(x+s); k = s; j = 2*k + 1; while (j{ if (j< *(x+j+1)) && *(x+j) /> { //判斷是否滿足堆的條件:滿足就繼續(xù)下一輪比較,否則調(diào)整。 j++; } if (t<*(x+j)){ *(x+k) = *(x+j); k = j; j = 2*k + 1; }else{ break; } } *(x+k) = t; } void heap_sort(int *x, int n){ int i, k, t; int *p; for (i=n/2-1; i>=0; i--){ sift(x,n,i); } for (k=n-1; k>=1; k--){ t = *(x+0); *(x+0) = *(x+k); *(x+k) = t; sift(x,k,0); } } void main(){ #define MAX 4 int *p, i, a[MAX]; p = a; printf("Input %d number for sorting :\n",MAX); for (i=0; i<MAX; i++){ scanf("%d",p++); } printf("\n"); p = a; select_sort(p,MAX); for (p=a, i=0; i++){ printf("%d ",*p++); } printf("\n"); system("pause"); }
上一篇:C語言單循環(huán)鏈表的表示與實現(xiàn)實例詳解
欄 目:C語言
本文標(biāo)題:C語言對堆排序一個算法思路和實現(xiàn)代碼
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/3651.html
您可能感興趣的文章
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用函數(shù)刪除字符
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)式函數(shù)庫
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對數(shù)怎么表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段函數(shù)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排序法函數(shù)
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段函數(shù)
- 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求階乘


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-10C#中split用法實例總結(jié)
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 04-02jquery與jsp,用jquery
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-10delphi制作wav文件的方法
- 01-11ajax實現(xiàn)頁面的局部加載