排序書(shū)中PPT學(xué)習(xí)教案_第1頁(yè)
排序書(shū)中PPT學(xué)習(xí)教案_第2頁(yè)
排序書(shū)中PPT學(xué)習(xí)教案_第3頁(yè)
排序書(shū)中PPT學(xué)習(xí)教案_第4頁(yè)
排序書(shū)中PPT學(xué)習(xí)教案_第5頁(yè)
已閱讀5頁(yè),還剩61頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、會(huì)計(jì)學(xué)1排序書(shū)中排序書(shū)中一、什么是排序?一、什么是排序?排序是計(jì)算機(jī)內(nèi)經(jīng)常進(jìn)行的一種操作,其目的是將一組“無(wú)序無(wú)序”的記錄序列的記錄序列調(diào)整為調(diào)整為“有序有序”的記錄序列。例如:將下列關(guān)鍵字序列52, 49, 80, 36, 14, 58, 61, 23, 97, 75調(diào)整為14, 23, 36, 49, 52, 58, 61 ,75, 80, 97第1頁(yè)/共66頁(yè) 一般情況下,假設(shè)含n個(gè)記錄的序列為 R1, R2, , Rn 其相應(yīng)的關(guān)鍵字序列為 K1, K2, ,Kn 這些關(guān)鍵字相互之間可以進(jìn)行比較,即在它們之間存在著這樣一個(gè)關(guān)系 : Kp1Kp2Kpn按此固有關(guān)系將上式記錄序列重新排列為

2、 Rp1, Rp2, ,Rpn 的操作操作稱作排序排序。第2頁(yè)/共66頁(yè)二、內(nèi)部排序和外部排序二、內(nèi)部排序和外部排序若整個(gè)排序過(guò)程不需要訪問(wèn)外存不需要訪問(wèn)外存便能完成,則稱此類排序問(wèn)題為內(nèi)部排內(nèi)部排序序; 反之,若參加排序的記錄數(shù)量很大, 整個(gè)序列的排序過(guò)程不可能在內(nèi)存中 完成,則稱此類排序問(wèn)題為外部排序外部排序。第3頁(yè)/共66頁(yè)三、內(nèi)部排序的方法三、內(nèi)部排序的方法內(nèi)部排序的過(guò)程是一個(gè)逐步擴(kuò)大逐步擴(kuò)大記錄的有序序列長(zhǎng)度有序序列長(zhǎng)度的過(guò)程。經(jīng)過(guò)一趟排序經(jīng)過(guò)一趟排序有序序列區(qū) 無(wú) 序 序 列 區(qū)有序序列區(qū)無(wú) 序 序 列 區(qū)第4頁(yè)/共66頁(yè)基于不同的“擴(kuò)大擴(kuò)大” 有序序列長(zhǎng)度的方法,內(nèi)部排序方法方法

3、,內(nèi)部排序方法大致可分下列幾種類型:插入類插入類交換類交換類選擇類選擇類 歸并類歸并類其它方法其它方法第5頁(yè)/共66頁(yè)待排記錄的數(shù)據(jù)類型定義如下待排記錄的數(shù)據(jù)類型定義如下:#define MAXSIZE 1000 / 待排順序表最大長(zhǎng)度待排順序表最大長(zhǎng)度typedef int KeyType; / 關(guān)鍵字類型為整數(shù)類型關(guān)鍵字類型為整數(shù)類型typedef struct KeyType key; / 關(guān)鍵字項(xiàng)關(guān)鍵字項(xiàng) InfoType otherinfo; / 其它數(shù)據(jù)項(xiàng)其它數(shù)據(jù)項(xiàng) RcdType; / 記錄類型記錄類型typedef struct RcdType rMAXSIZE+1; / r0

4、閑置閑置 int length; / 順序表長(zhǎng)度順序表長(zhǎng)度 SqList; / 順序表類型順序表類型第6頁(yè)/共66頁(yè)1. 插入類插入類將無(wú)序子序列中的一個(gè)或幾個(gè)記錄“插入插入”到有序序列中,從而增加記錄的有序子序列的長(zhǎng)度。第7頁(yè)/共66頁(yè)2. 交換類交換類通過(guò)“交換交換”無(wú)序序列中的記錄從而得到其中關(guān)鍵字最小或最大的記錄,并將它加入到有序子序列中,以此方法增加記錄的有序子序列的長(zhǎng)度。第8頁(yè)/共66頁(yè)3. 選擇類選擇類從記錄的無(wú)序子序列中“選擇”關(guān)鍵字最小或最大的記錄,并將它加入到有序子序列中,以此方法增加記錄的有序子序列的長(zhǎng)度。第9頁(yè)/共66頁(yè)4. 歸并類歸并類通過(guò)“歸并歸并”兩個(gè)或兩個(gè)以上的

5、記錄有序子序列,逐步增加記錄有序序列的長(zhǎng)度。5. 其它方法其它方法第10頁(yè)/共66頁(yè) 10. 2 插插 入入 排排 序序第11頁(yè)/共66頁(yè)有序序列R1.i-1Ri無(wú)序序列 Ri.n一趟直接插入排序的基本思想:有序序列R1.i無(wú)序序列 Ri+1.n第12頁(yè)/共66頁(yè)實(shí)現(xiàn)實(shí)現(xiàn)“一趟插入排序一趟插入排序”可分三步進(jìn)行:可分三步進(jìn)行:3將Ri 插入插入(復(fù)制)到Rj+1的位置上。2將Rj+1.i-1中的所有記錄記錄均后移后移 一個(gè)位置;1在R1.i-1中查找查找Ri的插入位置, R1.j.key Ri.key Rj+1.i-1.key;第13頁(yè)/共66頁(yè)直接插入排序直接插入排序(基于順序查找(基于順序

6、查找)不同的具體實(shí)現(xiàn)方法導(dǎo)致不同的算法描述不同的具體實(shí)現(xiàn)方法導(dǎo)致不同的算法描述折半插入排序折半插入排序(基于折半查找(基于折半查找)希爾排序希爾排序(基于逐趟縮小增量)(基于逐趟縮小增量)第14頁(yè)/共66頁(yè)一、直接插入排序一、直接插入排序利用 “順序查找順序查找”實(shí)現(xiàn)“在R1.i-1中查找查找Ri的插入位置”算法的實(shí)現(xiàn)要點(diǎn):算法的實(shí)現(xiàn)要點(diǎn):第15頁(yè)/共66頁(yè)從Ri-1起向前進(jìn)行順序查找, 監(jiān)視哨設(shè)置在R0;R0 = Ri; / 設(shè)置“哨兵”循環(huán)結(jié)束表明Ri的插入位置為 j +1R0jRifor (j=i-1; R0.keyRj.key; -j); / 從后往前找j=i-1插入位置插入位置第16

7、頁(yè)/共66頁(yè) 對(duì)于在查找過(guò)程中找到的那些關(guān)鍵字不小于Ri.key的記錄,并在查找的同時(shí)實(shí)現(xiàn)記錄向后移動(dòng);for (j=i-1; R0.keyRj.key; -j); Rj+1 = RjR0jRij= i-1上述循環(huán)結(jié)束后可以直接進(jìn)行“插入”插入位置插入位置第17頁(yè)/共66頁(yè)令 i = 2,3,, n, 實(shí)現(xiàn)整個(gè)序列的排序。for ( i=2; i=n; +i ) if (Ri.keyRi-1.key) 在 R1.i-1中查找Ri的插入位置; 插入Ri ; 第18頁(yè)/共66頁(yè)void InsertionSort ( SqList &L ) / 對(duì)順序表 L 作直接插入排序。 for ( i=2;

8、 i=L.length; +i ) if (L.ri.key L.ri-1.key) / InsertSortL.r0 = L.ri; / 復(fù)制為監(jiān)視哨for ( j=i-1; L.r0.key L.rj.key; - j ) L.rj+1 = L.rj; / 記錄后移L.rj+1 = L.r0; / 插入到正確位置第19頁(yè)/共66頁(yè)內(nèi)部排序的時(shí)間分析時(shí)間分析:實(shí)現(xiàn)內(nèi)部排序的基本操作基本操作有兩個(gè):(2)“移動(dòng)移動(dòng)”記錄。(1)“比較比較”序列中兩個(gè)關(guān)鍵字的 大?。坏?0頁(yè)/共66頁(yè)對(duì)于直接插入排序:最好的情況(關(guān)鍵字在記錄序列中順序有序):最好的情況(關(guān)鍵字在記錄序列中順序有序):“比較”的

9、次數(shù):最壞的情況(關(guān)鍵字在記錄序列中逆序有序):最壞的情況(關(guān)鍵字在記錄序列中逆序有序):“比較”的次數(shù):112nni02) 1)(4() 1(2nnini“移動(dòng)”的次數(shù):“移動(dòng)”的次數(shù):2) 1)(4() 1(2nnini第21頁(yè)/共66頁(yè) 因?yàn)?R1.i-1 是一個(gè)按關(guān)鍵字有序的有序序列,則可以利用折半查找折半查找實(shí)現(xiàn)“在R1.i-1中查找查找Ri的插入位置”,如此實(shí)現(xiàn)的插入排序?yàn)檎郯氩逭郯氩迦肴肱判颉6?、折半插入排序二、折半插入排序?2頁(yè)/共66頁(yè)void BiInsertionSort ( SqList &L ) / BInsertSort在在 L.r1.i-1中折半查找插入位置;中

10、折半查找插入位置;for ( i=2; i=high+1; -j ) L.rj+1 = L.rj; / 記錄后移L.rhigh+1 = L.r0; / 插入第23頁(yè)/共66頁(yè)low = 1; high = i-1;while (low=high) m = (low+high)/2; / 折半if (L.r0.key L.rm.key) high = m-1; / 插入點(diǎn)在低半?yún)^(qū)else low = m+1; / 插入點(diǎn)在高半?yún)^(qū)第24頁(yè)/共66頁(yè)14 36 49 52 8058 61 23 97 75ilowhighmmlowlowmhigh14 36 49 52 58 61 80 23 97

11、75ilowhighmhighmhighmlow例如:再如:插入位置插入位置L.rL.r第25頁(yè)/共66頁(yè) 三、希爾排序(又稱縮小增量排序)三、希爾排序(又稱縮小增量排序) 基本思想:對(duì)待排記錄序列先作“宏觀”調(diào)整,再作“微觀”調(diào)整。 所謂“宏觀”調(diào)整,指的是,“跳躍式”的插入排序。 具體做法為:第26頁(yè)/共66頁(yè)將記錄序列分成若干子序列,分別對(duì)每個(gè)子序列進(jìn)行插入排序。其中,d 稱為增量,它的值在排序過(guò)程中從大到小逐漸縮小,直至最后一趟排序減為 1。例如:將 n 個(gè)記錄分成 d 個(gè)子序列: R1,R1+d,R1+2d,R1+kd R2,R2+d,R2+2d,R2+kd Rd,R2d,R3d,R

12、kd,R(k+1)d 第27頁(yè)/共66頁(yè)例如:16 25 12 30 47 11 23 36 9 18 31 第一趟希爾排序,設(shè)增量 d =511 23 12 9 18 16 25 36 30 47 31 第二趟希爾排序,設(shè)增量 d = 39 18 12 11 23 16 25 31 30 47 36第三趟希爾排序,設(shè)增量 d = 1 9 11 12 16 18 23 25 30 31 36 47 第28頁(yè)/共66頁(yè)void ShellInsert ( SqList &L, int dk ) for ( i=dk+1; i=n; +i ) if ( L.ri.key0&(L.r0.keyL.r

13、j.key); j-=dk) L.rj+dk = L.rj; / 記錄后移,查找插入位置 L.rj+dk = L.r0; / 插入 / if / ShellInsert第29頁(yè)/共66頁(yè)void ShellSort (SqList &L, int dlta, int t) / 增量為dlta的希爾排序 for (k=0; k1) / while / BubbleSorti = n;i = lastExchangeIndex; / 本趟進(jìn)行過(guò)交換的 / 最后一個(gè)記錄的位置 if (Rj+1.key Rj.key) Swap(Rj, Rj+1); lastExchangeIndex = j; /記

14、下進(jìn)行交換的記錄位置 /iffor (j = 1; j i; j+)lastExchangeIndex = 1;第33頁(yè)/共66頁(yè)注意注意: :2. 一般情況下,每經(jīng)過(guò)一趟“起泡”,“i 減一”,但并不是每趟都如此。例如例如:523197825531579 89i=7i=6for (j = 1; j i; j+) if (Rj+1.key Rj.key) 13i=21. 起泡排序的結(jié)束條件為, 最后一趟沒(méi)有進(jìn)行最后一趟沒(méi)有進(jìn)行“交換記錄交換記錄”。第34頁(yè)/共66頁(yè)時(shí)間分析時(shí)間分析: :最好的情況(關(guān)鍵字在記錄序列中順序有序):最好的情況(關(guān)鍵字在記錄序列中順序有序): 只需進(jìn)行一趟起泡只需進(jìn)

15、行一趟起泡“比較比較”的次數(shù):的次數(shù):最壞的情況(關(guān)鍵字在記錄序列中逆序有序):最壞的情況(關(guān)鍵字在記錄序列中逆序有序): 需進(jìn)行需進(jìn)行n-1趟起泡趟起泡“比較比較”的次數(shù):的次數(shù):0“移動(dòng)移動(dòng)”的次數(shù):的次數(shù):“移動(dòng)移動(dòng)”的次數(shù):的次數(shù):n-12) 1() 1(2nnini2) 1(3) 1(32nnini第35頁(yè)/共66頁(yè)二、一趟快速排序(一次劃分)二、一趟快速排序(一次劃分)目標(biāo):目標(biāo):找一個(gè)記錄,以它的關(guān)鍵字作為“樞軸樞軸”,凡其關(guān)鍵字小于樞軸關(guān)鍵字小于樞軸的記錄均移動(dòng)至該記錄之前移動(dòng)至該記錄之前,反之,凡關(guān)鍵字大于關(guān)鍵字大于樞軸樞軸的記錄均移動(dòng)至該記錄之后移動(dòng)至該記錄之后。致使一趟排

16、序一趟排序之后,記錄的無(wú)序序列Rs.t將分割成兩部分分割成兩部分:Rs.i-1和Ri+1.t,且 Rj.key Ri.key Rj.key (sji-1) 樞軸樞軸 (i+1jt)。第36頁(yè)/共66頁(yè)52 49 80 36 14 58 61 97 23 75stlowhigh設(shè)設(shè) Rs=52 為樞為樞軸軸 將 Rhigh.key 和 樞軸的關(guān)鍵字進(jìn)行比較,要求Rhigh.key 樞軸的關(guān)鍵字 將 Rlow.key 和 樞軸的關(guān)鍵字進(jìn)行比較,要求Rlow.key 樞軸的關(guān)鍵字high23low80high14low52例如例如R052lowhighhighhighlow第37頁(yè)/共66頁(yè) 可見(jiàn),

17、經(jīng)過(guò)“一次劃分一次劃分” ,將關(guān)鍵字序列 52, 49, 80, 36, 14, 58, 61, 97, 23, 75 調(diào)整為: 23, 49, 14, 36, (52) 58, 61, 97, 80, 75 在調(diào)整過(guò)程中,設(shè)立了兩個(gè)指針: low 和high,它們的初值分別為: s 和 t, 之后逐漸減小 high,增加 low,并保證 Rhigh.key52,和 Rlow.key52,否則進(jìn)行記錄的“交換”。第38頁(yè)/共66頁(yè)int Partition (RedType& R, int low, int high) pivotkey = Rlow.key; while (lowhigh)

18、while (low=pivotkey) -high; RlowRhigh; while (lowhigh & Rlow.key=pivotkey) +low; RlowRhigh; return low; / 返回樞軸所在位置 / Partition第39頁(yè)/共66頁(yè)int Partition (RedType R, int low, int high) / Partition R0 = Rlow; pivotkey = Rlow.key; / 樞軸 while (lowhigh) while(low=pivotkey) - high; / 從右向左搜索Rlow = Rhigh;while

19、(lowhigh & Rlow.key=pivotkey) + low; / 從左向右搜索Rhigh = Rlow;Rlow = R0; return low;第40頁(yè)/共66頁(yè)三、快速排序三、快速排序 首先對(duì)無(wú)序的記錄序列進(jìn)行“一次劃分一次劃分”,之后分別分別對(duì)分割所得兩個(gè)子序列“遞遞歸歸”進(jìn)行快速排序進(jìn)行快速排序。無(wú) 序 的 記 錄 序 列無(wú)序記錄子序列(1)無(wú)序子序列(2)樞軸樞軸一次劃分分別進(jìn)行快速排序第41頁(yè)/共66頁(yè)void QSort (RedType & R, int s, int t ) / 對(duì)記錄序列Rs.t進(jìn)行快速排序 if (s t-1) / 長(zhǎng)度大于1 / QSort

20、pivotloc = Partition(R, s, t); / 對(duì) Rs.t 進(jìn)行一次劃分一次劃分QSort(R, s, pivotloc-1); / 對(duì)低子序列遞歸排序,pivotloc是樞軸位置是樞軸位置QSort(R, pivotloc+1, t); / 對(duì)高子序列遞歸排序第42頁(yè)/共66頁(yè)void QuickSort( SqList & L) / 對(duì)順序表進(jìn)行快速排序 QSort(L.r, 1, L.length); / QuickSort 第一次調(diào)用函數(shù) Qsort 時(shí),待排序記錄序列的上、下界分別為 1 和 L.length。快速排序的時(shí)間復(fù)雜度為快速排序的時(shí)間復(fù)雜度為O(nlo

21、gn) 第43頁(yè)/共66頁(yè)10.4 堆堆 排排 序序簡(jiǎn)簡(jiǎn) 單單 選選 擇擇 排排 序序堆堆 排排 序序第44頁(yè)/共66頁(yè)一、簡(jiǎn)單選擇排序一、簡(jiǎn)單選擇排序假設(shè)排序過(guò)程中,待排記錄序列的狀態(tài)為:有序序列R1.i-1 無(wú)序序列 Ri.n 第 i 趟簡(jiǎn)單選擇排序從中選出關(guān)鍵字最小的記錄有序序列R1.i無(wú)序序列 Ri+1.n第45頁(yè)/共66頁(yè)簡(jiǎn)單選擇排序的算法描述如下:void SelectSort (Elem R, int n ) / 對(duì)記錄序列R1.n作簡(jiǎn)單選擇排序。 for (i=1; i0; -i ) HeapAdjust ( H.r, i, H.length ); / 建大頂堆for ( i=

22、H.length; i1; -i ) H.r1H.ri; / 將堆頂記錄和當(dāng)前未經(jīng)排序子序列 / H.r1.i中最后一個(gè)記錄相互交換 HeapAdjust(H.r, 1, i-1); / 對(duì) H.r1 進(jìn)行篩選第51頁(yè)/共66頁(yè)如何如何“建堆建堆”??jī)蓚€(gè)問(wèn)題兩個(gè)問(wèn)題:如何如何“篩選篩選”?定義堆類型為定義堆類型為:typedef SqList HeapType; / 堆采用順序表表示之第52頁(yè)/共66頁(yè)所謂“篩選篩選”指的是,對(duì)一棵左/右子樹(shù)均為堆的完全二叉樹(shù),“調(diào)整調(diào)整”根結(jié)根結(jié)點(diǎn)點(diǎn)使整個(gè)二叉樹(shù)也成為一個(gè)堆。堆堆篩選篩選第53頁(yè)/共66頁(yè)98814973556412362740例如例如:是大

23、頂堆是大頂堆12但在 98 和 12 進(jìn)行互換之后,它就不不是堆了,因此,需要對(duì)它進(jìn)行“篩選”。98128173641298比較比較比較第54頁(yè)/共66頁(yè)void HeapAdjust (RcdType &R, int s, int m) / 已知 Rs.m中記錄的關(guān)鍵字除 Rs 之外均 / 滿足堆的特征,本函數(shù)自上而下調(diào)整 Rs 的 / 關(guān)鍵字,使 Rs.m 也成為一個(gè)大頂堆 / HeapAdjustrc = Rs; / 暫存 Rs for ( j=2*s; j= Rj.key ) break; / 再作“根”和“子樹(shù)根”之間的比較, / 若“=”成立,則說(shuō)明已找到 rc 的插 / 入位置

24、s ,不需要繼續(xù)往下調(diào)整Rs = Rj; s = j; / 否則記錄上移,尚需繼續(xù)往下調(diào)整if ( jm & Rj.keyRj+1.key ) +j; / 左/右“子樹(shù)根”之間先進(jìn)行相互比較 / 令 j 指示關(guān)鍵字較大記錄的位置第56頁(yè)/共66頁(yè)建堆是一個(gè)從下往上進(jìn)行建堆是一個(gè)從下往上進(jìn)行“篩選篩選”的過(guò)程。的過(guò)程。40554973816436122798例如例如: 排序之前的關(guān)鍵字序列為123681734998817355 現(xiàn)在,左/右子樹(shù)都已經(jīng)調(diào)整為堆,最后只要調(diào)整根結(jié)點(diǎn),使整個(gè)二叉樹(shù)是個(gè)“堆”即可。98494064361227第57頁(yè)/共66頁(yè)堆排序的時(shí)間復(fù)雜度為O(nlogn)。第58頁(yè)/共66頁(yè)10.5 歸歸 并并 排排 序序歸并排序的過(guò)程基于下列基本思想基本思想進(jìn)行: 將兩個(gè)或兩個(gè)以上的有序子序列 “歸并” 為一個(gè)有序序列。第59頁(yè)/共66頁(yè)在內(nèi)部排序中,通常采用的是2-路歸并排序。即:將兩個(gè)位置相鄰位置相鄰的記錄有序子序列歸并為一個(gè)一個(gè)記錄的有序序列。有有 序序 序序 列列 Rl.n有序子序列有序子序列

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論