堆排序(C語言實現)

來源:互聯網
上載者:User

標籤:art   pac   water   個數   技術   堆排序   details   表示   輸入   

            之前的部落格介紹介紹了數組的兩種排序演算法:插入排序和歸併排序(採用遞迴),見連結http://blog.csdn.net/u013165521/article/details/46845033。

        本篇部落格,介紹還有一種排序演算法:堆排序。

(內容參照演算法導論)

一、堆的概念

         所謂堆,它是一個數組,也能夠被看成一個近似的全然二叉樹。樹上每一個結點相應數組的一個元素。二元堆積分為二種:最大堆和最小堆。本文主要介紹最大堆,最小堆類似。最大堆的特點:對於隨意某個結點,該結點的值大於左孩子、右孩子的值,可是左右孩子的值沒有要求。

二、堆排序演算法         堆排序演算法調用函數Build_max_heap將輸入數組array[1..n]建立成堆。當中n表示數組長度。由於建立堆後,數組的最大元素被存放在根節點A[1],通過將A[1]與數組最後一個元素進行交換。將最大元素後移,實現排序。

可是,交換後新的根節點可能不滿足堆的特點,所以須要調用子函數Max_heapify對剩餘的數組元素進行最大堆性質的維護。堆排序演算法。通過不斷反覆這個過程(n-1)次,實現數組的從小到大排序(由於採用最大堆)。

         對於上面提及的兩個子函數進行簡要介紹。

         函數Build_max_heap的作用:建堆

由於子數組A(n/2+1..n)是樹的葉子節點,不須要進行堆的維護。

所以。僅僅須要對A[1..n/2]數組元素進行維護。就可構建堆。         函數Max_heapify的作用:維護堆。過程:如果A[i]表示樹的某個結點,則A[2*i]是其左孩子,A[2*i+1]是其右孩子。接下來,比較三者大小挑選出最大元素的下標,存放於largest。然後。推斷(largest==i)嗎。若不滿足則進行元素交換。將大的元素上移。

此時,以A[largest]為根節點的子樹可能不滿足堆的性質,所以須要遞迴調用自身。
三、演算法實現         上面介紹堆實現數組排序的原理,以下直接給出原始碼。

#include <stdlib.h>#include <stdio.h>#include <iostream>using namespace std;void Swap(int *x, int *y);void Max_heapify(int array[], int i, int heap_size);void Build_max_heap(int array[],int len);void Heapsort(int array[],int len);void Swap(int *x, int *y){int temp;temp=*x;*x=*y;*y=temp;}void Max_heapify(int array[], int i, int heap_size){int largest;int _left=2*i;int _right=2*i+1;if (_left<=heap_size && array[_left]>array[i]){largest=_left;}elselargest=i;if (_right<=heap_size && array[_right]>array[largest]){largest=_right;}if (largest!=i){Swap(&array[largest],&array[i]);Max_heapify(array,largest,heap_size);}}void Build_max_heap(int array[],int len){int heap_size=len;for (int i=len/2; i>=1; i--){Max_heapify(array,i,heap_size);}}void Heapsort(int array[],int len){int heap_size=len;Build_max_heap(array,len);for (int i=len; i>=2; i--){Swap(&array[1],&array[i]);heap_size--;Max_heapify(array,1,heap_size);}}void main(){int array[]={0,14,10,8,7,9,3,2,4,1};int len=9;Heapsort(array,len);cout<<"heap sort result:\n";for (int i=1; i<=len; i++){cout<<array[i]<<" ";}cout<<endl;}

實驗結果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

堆排序(C語言實現)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.