排序方法之堆排序

2021-06-23 00:38:13 字數 1521 閱讀 3626

** 

堆排序的實現

(—)建立初始堆

(二)堆排序

在建立初始堆之前首先要了解一些關於堆的概念,還需要了解一些關於平衡二叉樹的內容

(1)堆的節點數 =n/2; 並且是只舍不入;

(2)最後乙個堆結點=(n/2)-1;

(3)對於任意結點a[x],可以找到它子結點上的內容a[2x+1]和a[2x+2]

(——)建立乙個堆

實現原理:

它考察堆的各個結點並且使之成為乙個堆。這意味著各個結點的值無論何時小於它的子結點的值,都要對此節點與最大的子節點進行交換。對於每個結點,要檢查是否應該改變,並且遞迴檢查引起變化的子節點。

此**重新排列了陣列data內的內容,使各個結點的值都大

於其子結點的值,有效的建立了乙個堆

int i,j,j2,k;

int tmp;

//外迴圈  :考慮所有的結點,從最後乙個開始,直到根部

for(k =(n>>1)-1;k>=0;k--)

//此時,i指向具有最大值的子女

if(tmp

data[j]= data[i];

else

break;

}data[j]= tmp;

}(二)堆排序

實現原理:

取堆的的根節點,也就是陣列中最大的數,把它與陣列中的最後乙個元素交換。這個元素是最後乙個結點最後乙個樹葉的子女。此時,前根元素恰好位於它應在的位置。但是要對新堆進行判斷。方法同建立堆中的內迴圈相同。當新堆的重新判斷完成後,再一次得到根元素,且把它與最後乙個結點的最後乙個頁結點交換。

for(k=n-1;k>0;k--)

if(tmp

data[j]=data[i];

else

break;              

}data[j]=tmp;

}for(j=0;j

cout<

}下面是堆排序的完整實現的**示例。

#include

using namespace std;

void  heapsort(int *data,int  n )

//此時,i指向具有最大值的子女

if(tmp

data[j]= data[i];

else

break;

}data[j]= tmp;

}for(k=n-1;k>0;k--)

if(tmp

data[j]=data[i];

else

break;              

}data[j]=tmp;

}for(j=0;j

cout<

}int main()

;heapsort(data,10); 

return 0;

}(三)

堆排序的優缺點

其複雜度為o(nlog2n),也適合較小量的資料

優點:(1)平均情形和最壞情形時效率都很高。

(2)執行時占用記憶體較少

缺點:(1)演算法不穩定

排序之堆排序

堆排序是一種基於比較排序的另一種排序演算法,它採用了一種近似完全二叉樹的二叉堆資料結構。演算法實現相容了插入排序的空間原址性 即只需要有限個額外的儲存空間 和歸併排序的優良時間複雜度。偽 如下 heapsort a build max heap a for i a.length downto 2 e...

排序之堆排序

這裡沒有對0號元素進行排序 堆排 public class heap public static void exec comparable array,int i,int j 下沉 private static void sink comparable array,int k,int n publi...

排序之堆排序

堆其實是一種完全二叉樹,從上到下從左到右,大頂堆的父節點大於其左右子節點,小頂堆的父節點小於其左右子節點 1 首先是進行heapify,建立堆 2 從下到上,從右到左的進行heapify構建有序的堆 3 進行排序,將堆頂父節點和底層最右邊的子節點互換,然後不斷重複以上步驟 1 heapify def...