-
- 素材大小:
- 4.12 MB
- 素材授權(quán):
- 免費(fèi)下載
- 素材格式:
- .ppt
- 素材上傳:
- chenrong
- 上傳時(shí)間:
- 2018-08-03
- 素材編號(hào):
- 204887
- 素材類(lèi)別:
- 課件PPT
-
素材預(yù)覽
這是數(shù)據(jù)結(jié)構(gòu)基數(shù)排序ppt,包括了內(nèi)部排序,概述,插入排序,交換排序,選擇排序,歸并排序,基數(shù)排序,什么是排序等內(nèi)容,歡迎點(diǎn)擊下載。
數(shù)據(jù)結(jié)構(gòu)基數(shù)排序ppt是由紅軟PPT免費(fèi)下載網(wǎng)推薦的一款課件PPT類(lèi)型的PowerPoint.
數(shù)據(jù)結(jié)構(gòu)課程的內(nèi)容
第10章 內(nèi)部排序
10.1 概述
10.1 概述
4. 什么叫內(nèi)部排序?什么叫外部排序?
6. 順序存儲(chǔ)(順序表)的抽象數(shù)據(jù)類(lèi)型如何表示?
7. 內(nèi)部排序的算法有哪些?
10.2 插入排序
1) 直接插入排序
例2:關(guān)鍵字序列T= (21,25,49,25*,16,08),請(qǐng)寫(xiě)出直接插入排序的具體實(shí)現(xiàn)過(guò)程。
Void InsertSort(SqList &L)
{ // 對(duì)順序表L做直接插入排序
for ( i=2; i<=L.length; ++i )
if ( LT(L.r[i].key,L.r[i-1].key) )
// “<“,需將L.r[i]插入有序子表
{ L.r[0] = L.r[i]; // 復(fù)制為哨兵
L.r[i] = L.r[i-1];
for( j=i-2; LT(L.r[0].key,L.r[i].key);--j )
L.r[ j+1] = L.r[ j]; // 記錄后移
L.r[ j+1] = L.r[0]; // 插入到正確位置
}
} // InsertSort
直接插入排序的算法分析
2) 折半插入排序
Void BInsertSort (SqList &L) // 折半插入排序
{ for ( i=2;i<=L.length;++i )
{ L.r[0] = L.r[ i ]; // 將L.r [i] 暫存到L.r[0]
low=1;high=i-1;
while (low<=high) // 比較,折半查找插入位置
{ m=(low+high)/2; // 折半
if (LT(L.r[0].key,L.r[m].key)) high=m-1;//插入點(diǎn)在低半?yún)^(qū)
else low=m+1; // 插入點(diǎn)在高半?yún)^(qū)
} // while
for (j=i-1;j>=high+1;--j) L.r [j+1] = L.r [j];// 記錄后移
L.r [high+1] = L.r [0]; // 插入
} // for
} // BInsertSort
折半插入排序的算法分析
討論:若記錄是鏈表結(jié)構(gòu),用直接插入排序行否?折半插入排序呢?
答:直接插入不僅可行,而且還無(wú)需移動(dòng)元素,時(shí)間效率更高!但鏈表無(wú)法“折半”!
折半插入排序的改進(jìn)——2-路插入排序見(jiàn)教材P267。
(1)基本思想: P267
(2)舉 例:P268 圖10.2
(3)算法分析:移動(dòng)記錄的次數(shù)約為n2/8
2-路插入排序只能減少移動(dòng)記錄的次數(shù),而不能絕對(duì)避免移動(dòng)記錄。實(shí)現(xiàn)是借助循環(huán)向量。
=> 若希望在排序過(guò)程中不移動(dòng)記錄,只有改變存儲(chǔ)結(jié)構(gòu),進(jìn)行表插入排序。
4)希爾(shell)排序(又稱(chēng)縮小增量排序)
例:關(guān)鍵字序列 T=(49,38,65,97, 76, 13, 27, 49*,55, 04),請(qǐng)寫(xiě)出希爾排序的具體實(shí)現(xiàn)過(guò)程。
時(shí)間效率:
附:希爾排序算法分析
希爾排序算法(其中某一趟的排序操作)
課堂練習(xí):
原始序列: 256,301,751,129,937,863,742,694,076,438
原始序列: 256,301,751,129,937,863,742,694,076,438
10.3 交換排序
1) 冒泡排序
for(j=0;j<n;j++)
for(i=0;i<n-1-j;i++)
if (a[i]>a[i+1]) // 需要互換
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
冒泡排序的算法分析
2) 快速排序
例1:關(guān)鍵字序列 T=(21,25,49,25*,16,08),請(qǐng)寫(xiě)出快速排序的算法步驟。
討論1.這種不斷劃分子表的過(guò)程,計(jì)算機(jī)如何自動(dòng)實(shí)現(xiàn)?
例2:關(guān)鍵字序列 T=(21,25,49,25*,16,08),請(qǐng)寫(xiě)出快速排序算法的一趟實(shí)現(xiàn)過(guò)程。
一趟快速排序算法流程圖
整個(gè)快速排序的遞歸算法:
例3:以關(guān)鍵字序列(256,301,751,129,937,863,742,694,076,438)為例,寫(xiě)出執(zhí)行快速算法的各趟排序結(jié)束時(shí),關(guān)鍵字序列的狀態(tài)。
快速排序算法詳細(xì)分析:
討論2. “快速排序”是否真的比任何排序算法都快?
10.4 選擇排序
1)簡(jiǎn)單選擇排序
例:關(guān)鍵字序列T= (21,25,49,25*,16,08),請(qǐng)給出簡(jiǎn)單選擇排序的具體實(shí)現(xiàn)過(guò)程。
簡(jiǎn)單選擇排序的算法如下:(亦可參見(jiàn)教材P276)
2) 錦標(biāo)賽排序 (又稱(chēng)樹(shù)形選擇排序)
第一趟:
第二趟:
第三趟:
第四趟:
第五趟:
第六趟:
第七趟:
算法分析:
3) 堆排序
例:
2. 怎樣建堆?
Void HeapAdjust(HeapType &H, int s,int m)
{ //
rc = H.r[s];
for ( j=2*s; j<=m; j*=2) // 沿key較大的孩子結(jié)點(diǎn)向下篩選
{ if ( j<m && LT(H.r[ j].key, H.r[ j+1].key) )
++j ; // j 為key較大的記錄的下標(biāo)
if (!LT(rc.key,H.r[ j].key)) break; // rc應(yīng)插入在位置s上
H.r[s] = H.r[ j]; s=j;
}
H.r[s]=rc; // 插入
}
3. 怎樣進(jìn)行堆排序?
例:對(duì)剛才建好的大根堆進(jìn)行排序:
堆排序的算法
附1:基于初始堆進(jìn)行堆排序的算法步驟:
附2:算法流程
堆排序算法分析:
10.5 歸并排序
一趟歸并排序算法: (兩路有序并為一路) 參見(jiàn)教材P283
遞歸形式的兩路歸并排序算法: 參見(jiàn)教材P284 (一路無(wú)序變?yōu)橛行?
歸并排序算法分析:
各種內(nèi)部排序方法的比較 (教材P289)
討論:若初始記錄基本無(wú)序,則選用哪些排序方法比較適合?若初始記錄基本無(wú)序,則最好選用哪些排序方法?數(shù)據(jù)結(jié)構(gòu)查找ppt:這是數(shù)據(jù)結(jié)構(gòu)查找ppt,包括了基本概念與術(shù)語(yǔ),靜態(tài)查找表,動(dòng)態(tài)查找表,哈希表查找,小結(jié)與習(xí)題等內(nèi)容,歡迎點(diǎn)擊下載。
數(shù)據(jù)結(jié)構(gòu)ppt最短路徑:這是數(shù)據(jù)結(jié)構(gòu)ppt最短路徑,包括了最短路徑的定義,Dijkstra算法,F(xiàn)loyd算法,F(xiàn)loyd算法——C++描述等內(nèi)容,歡迎點(diǎn)擊下載。
數(shù)據(jù)庫(kù)答辯ppt:這是數(shù)據(jù)庫(kù)答辯ppt,包括了數(shù)據(jù)庫(kù)用戶(hù)管理和安全設(shè)置,數(shù)據(jù)庫(kù)日志、作業(yè)與警報(bào)管理,復(fù)雜數(shù)據(jù)庫(kù)備份和數(shù)據(jù)庫(kù)維護(hù),收獲與體會(huì)等內(nèi)容,歡迎點(diǎn)擊下載。