第 1 頁:3.1排序算法 |
第 15 頁:3.2查找算法 |
堆排序:對n個元素的序列進行堆排序,先將其建成堆,以根結點與第n個結點交換;調整前n-1個結點成為堆,再以根結點與第n-1個結點交換;重復上述操作,直到整個序列有序。
【算法10.10】
void HeapAdjust(S_TBL *h,int s,int m)
{/*r[s…m]中的記錄關鍵碼除r[s]外均滿足堆的定義,本函數(shù)將對第s個結點為根的子樹篩選,使其成為大頂堆*/
rc=h->r[s];
for(j=2*s;j<=m;j=j*2) /* 沿關鍵碼較大的子女結點向下篩選 */
{ if(j
j=j+1; /* 為關鍵碼較大的元素下標*/
if(rc.key
h->r[s]=h->r[j]; s=j; /* 使s結點滿足堆定義 */
}
h->r[s]=rc; /* 插入 */
}
void HeapSort(S_TBL *h)
{ for(i=h->length/2;i>0;i--) /* 將r[1..length]建成堆 */
HeapAdjust(h,i,h->length);
for(i=h->length;i>1;i--)
{ h->r[1]<-->h->r[i]; /* 堆頂與堆低元素交換 */
HeapAdjust(h,1,i-1); /*將r[1..i-1]重新調整為堆*/
}
}
交換記錄至多k次。所以,在建好堆后,排序過程中的篩選次數(shù)不超過下式:
+û1)-log2(në( 2 )û + … + log22û2)-log2(në < nlog2n2
而建堆時的比較次數(shù)不超過4n次,因此堆排序最壞情況下,時間復雜度也為O(nlog2n)。
相關推薦:2010年軟件水平考試軟件設計師專題講義匯總北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內蒙古 |