freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

工學(xué)第九章ppt課件-文庫吧資料

2024-11-09 20:42本頁面
  

【正文】 第 9章 排 序 在堆排序圖示中,堆越畫越小,實(shí)際上,在 r向量中堆頂元素輸出之后并未刪除,而是與堆尾元素對換。 /*堆頂堆尾元素交換 */ heap(r,1,v1)。 r[1]=r[v]。v) {printf(%5d,r[1].key)。 /*初建堆 */ for (v=n。i=1。 /* 、右孩子的關(guān)鍵字,強(qiáng)制使 jm,以便結(jié)束循環(huán) */ } r[i]=x。 j=2*i。 /*當(dāng)結(jié)點(diǎn) i有左、右兩個孩子時(shí), j取關(guān)鍵字較小的孩子結(jié)點(diǎn)編號 */ if (r[j].key) {r[i]=r[j]。j=2*i。 主體算法由函數(shù) heapsort實(shí)現(xiàn) 。 第 9章 排 序 4294 17 46135580( 1 ) 輸出 5 , 80 移 上 來4294 80 461755134294 80175546( 2 ) 輸出 13 , 46 移 上 來4294 804655175594464280( 3 ) 輸出 17 , 80 移 上 來559446804255 468094( 4 ) 輸出 42 , 94 移 上 來55 948046( 5 ) 輸出 46 , 80 移 上 來55 948080 9455( 6 ) 輸出 55 , 94 移 上 來8094 8094( 7 ) 輸出 80 , 94 移 上 來94( 8 ) 輸出 94圖 堆排序的操作過程 第 9章 排 序 堆排序算法實(shí)現(xiàn):由上述可知 , 有一種操作過程 (即調(diào)整恢復(fù)堆 )要被多次反復(fù)調(diào)用 , 那就是當(dāng) i值確定之后 , 以 ki為比較參照值 , 與它的左 、 右孩子的關(guān)鍵字比較和調(diào)整 , 使得以結(jié)點(diǎn) i為根的子樹成為堆 , 因此把這個過程設(shè)計(jì)成一個函數(shù)heap。請注意:每輸出一次堆頂元素,堆頂與堆尾元素就交換一次,同時(shí)堆尾的邏輯位置退 1,直到堆中剩下一個元素為止。這是一個反復(fù)輸出堆頂元素,將堆尾元素移至堆頂,再調(diào)整恢復(fù)堆的過程。此時(shí)將kz填入適當(dāng)位置,使之成為堆,在圖 (c)中,先把 5調(diào)整上來,然后把 13移到 5原來的位置上,最后將 kz(即 46)填到 13原來的位置上。在圖 (c)中, i=1時(shí), kk3都小于 kz(42, 546),則讓 k3(即 5)移上去。如果結(jié)點(diǎn) i的某一個孩子的關(guān)鍵字小于 kz,則把這個孩子結(jié)點(diǎn)移上來。如果一開始 kz比 k2i和 k2i+1均小,則不進(jìn)行任何調(diào)整。因?yàn)?n=8,所以從 i=4開始,見圖 。 第 9章 排 序 例 設(shè)有 n個記錄 (n=8)的關(guān)鍵字是 {46, 55, 13, 42, 94,17, 5, 80}, 試對它們進(jìn)行堆排序 。 (2) 堆排序。 所以先取 i=n/2(它一定是第 n個結(jié)點(diǎn)雙親的編號 )將以 i結(jié)點(diǎn)為根的子樹調(diào)整為堆;然后令 i=i1, 再將以 i結(jié)點(diǎn)為根的子樹調(diào)整為堆 。 (1) 初建堆 。 第 9章 排 序 1219 6538 27 73( a )24 56 3( b )34 812( c )32 85( d )圖 堆與非堆 第 9章 排 序 堆排序的思路是:把 n個記錄存于向量 r之中 , 把它看成完全二叉樹 , 此時(shí)關(guān)鍵字序列不一定滿足堆的關(guān)系 。若完全二叉樹中任一非葉子結(jié)點(diǎn)的值小于等于 (或大于等于 )其左、右孩子結(jié)點(diǎn)的值,則從根結(jié)點(diǎn)開始按結(jié)點(diǎn)編號排列所得的結(jié)點(diǎn)序列就是一個堆。不難看出,滿足堆的邏輯關(guān)系的一組數(shù)據(jù),可畫成二叉樹的形狀,并且它是一棵完全二叉樹樹形。結(jié)點(diǎn)編號對應(yīng)向量中的下標(biāo)號。反過來講,結(jié)點(diǎn) 2i是結(jié)點(diǎn) i的左孩子,結(jié)點(diǎn) 2i+1是結(jié)點(diǎn) i的右孩子。堆是一種數(shù)據(jù)元素之間的邏輯關(guān)系,常用向量做存儲結(jié)構(gòu)。 堆是 n個元素的有限序列 { K1,K2,…,K n },它當(dāng)且僅當(dāng)滿足如下關(guān)系: ??? ????n / 2 ),1 ,2 ,(ikkkk12ii2ii ?第 9章 排 序 這是一個上小、底大的堆。 r[z]=x。 if(zi) { x=r[i]。j=n。i++) { z=i。 第 一 趟 3 4 1 5 2第 二 趟 [ 1 ] 4 3 5 2第 三 趟 [1 2] 3 5 4第 四 趟 [1 2 3 5] 4結(jié) 果 [1 2 3 4 5]圖 簡單選擇排序 第 9章 排 序 假設(shè)用變量 z記下較小值的下標(biāo),則算法如下: 算法 void sisort(node r[?],int n) {for (i=1。 第 9章 排 序 由此可見,對于 n個記錄的關(guān)鍵字,需要 n1趟;而在每趟之中,又有一個內(nèi)循環(huán)。第 (n1)趟,從 Kn Kn中選擇最小值 Kz,將 Kz與 Kn1對換,最后剩下的就是該序列中的最大值,一個由小到大的有序序列就這樣形成。 對于一組關(guān)鍵字 { K1,K2,… ,Kn}, 將其由小到大進(jìn)行簡單排序的具體思路是: 首先從 K1,K2, …,K n中選擇最小值,假如它是 Kz,則將 Kz與 K1對換;然后從 K2, K3, … , Kn中選擇最小值 Kz,再將 Kz與 K2對換。 第 9章 排 序 選 擇 排 序 簡單選擇排序 簡單選擇排序 (simple selection sort)也是直接選擇排序 。 快速排序的控制字取法并不惟一。 51表示排序之前它位于52的前面 。 第 9章 排 序 例 試用 [6,7,51,2,52,8]進(jìn)行快速排序 。而這種情況的冒泡排序是 O(n),反而很快??墒撬惴ǖ膬?yōu)勢并不是絕對的??扇氲淖訁^(qū)個數(shù)接近 n,此時(shí)棧的最大深度為 n。分母中 2的指數(shù)恰好反映出需要入棧的子區(qū)個數(shù),它就是 lbn,也即棧的深度。 } } 第 9章 排 序 3) 快速排序算法空間時(shí)間及穩(wěn)定性分析 快速排序的非遞歸算法引用了輔助棧,它的深度為 lbn。 輸出 r。 quicksort1(r,n)。 l=1。 主程序的主要操作如下: 調(diào)用遞歸函數(shù) 調(diào)用非遞歸函數(shù) {creat(r,n)。 /*對右分區(qū)快速排序 */ } } /*quicksort2*/ 第 9章 排 序 在主程序調(diào)用非遞歸算法時(shí)比較簡單易懂 。 /*劃分兩個區(qū) */ quicksort2(r,l,i1)。 } }while (tag==1)。 h=s[top][1]。 } /*tag=0表示???*/ if (top==0) tag=0。 s[top][1]=h。 top++。top=0。h=n。圖 對例 ,在此基礎(chǔ)上經(jīng)過多次調(diào)用 hoare后,最后得出第五行的結(jié)果。return(i)。} }while(ij)。 if (ij) {r[j]=r[i]。amp。i++。 (r[j].key=)) j。 do { while((ij) amp。j=h。至此將文件分成了左、右兩個子區(qū),其具體操作見圖 。從文件右端元素 r[j].key開始與控制字,當(dāng) r[j].key大于等于 ,記錄 r[j]不移動,修改 j指針, j,直到 r[j].key,把記錄 r[j]移到文件左邊 i所指向的位置;然后在文件左邊修改 i指針, i++,讓 r[i].key與,當(dāng) r[i].key小于等于 ,記錄 r[i]不移動,修改 i指針, i++,直到 r[i].key,把記錄 r[i]移到文件右邊 j所指向的位置;再到文件右邊修改 j指針, j。 思路:首先用兩個指針 i、 j分別指向首、尾兩個關(guān)鍵字,i=1,j=8。 第 9章 排 序 1) 分區(qū)處理函數(shù) hoare 例 設(shè)有一組關(guān)鍵字 {46,56,14,43,95,19,18,72}, 這里 n=8。 由以上三步可以看出:快速排序算法總框架是進(jìn)行多趟的分區(qū)處理;而對某一特定子區(qū),則應(yīng)把它看成又是一個待排序的文件,控制字總是取子區(qū)中第一個記錄的關(guān)鍵字。 第 9章 排 序 (3) 重復(fù)第 (1)、 (2)步 , 直到左區(qū)處理完畢 。在子區(qū)內(nèi)數(shù)據(jù)尚處于無序狀態(tài)。 快速排序方法的實(shí)質(zhì)是將一組關(guān)鍵字 [K1,K2,… ,Kn]進(jìn)行分區(qū)交換排序 。 第 9章 排 序 快速排序 快速排序由霍爾 (Hoare)提出 , 它是一種對冒泡排序的改進(jìn) 。該算法的時(shí)間復(fù)雜度為 O(n2)。 } /*bubblesort*/ 第 9章 排 序 算法中 tag為標(biāo)志變量,當(dāng)某一趟處理過程中未進(jìn)行過記錄交換時(shí) tag值應(yīng)為 0,若發(fā)生過交換,則 tag值為 1。amp。 } i++。 r[j1]=x。j) if (r[j].keyr[j1].key) { x=r[j]。 for (j=n。算法如下: 第 9章 排 序 第一趟4455223399116677第二趟1144552233996677第三趟1122445533669977第四趟1122334455667799圖 冒泡排序 第 9章 排 序 算法 void bubblesort(node r[?],int n) { i=1。請看第四趟處理,關(guān)鍵字的兩兩比較過程中,并未發(fā)生記錄交換。 排序過程如圖 。 (4) 讓 j取 n至 n1, 將 r[n].key與 r[n1].key對比 , 把關(guān)鍵字較小的記錄交換到 r[n1]之中 。 (2) 讓 j取 n至 3,重復(fù)上述的比較對換操作,最終 r[2]之中存放的是剩余 n1個記錄 (r[1]除外 )中關(guān)鍵字最小的記錄。 最后是 r[2].key與 r[1].key對比 , 關(guān)鍵字較小的記錄就換到 r[1]的位置上 , 到此第一趟結(jié)束 。在排序過程中,關(guān)鍵字較小的記錄經(jīng)過與其他記錄的對比交換,像水中的氣泡向上冒出一樣,移到序列的首部,故稱此方法為冒泡排序法。如果對關(guān)鍵字序列 {6,7,51,2,52,8}進(jìn)行希爾排序,可以看出希爾排序是不穩(wěn)定的。到目前為止沒有人找到一種最好的增量序列。 由于前邊大增量的處理 , 使關(guān)鍵字大體有序 , 因此最后一趟排序移動的記錄少 , 處理速度快 。 第 9章 排 序 對整個文件來說,排序結(jié)果實(shí)際上為:[12,22,60,33,76,79,98,81]。例如 k=2時(shí) , 關(guān)鍵字分成二組 , 見圖 2行 , 其中第 1組是[76,12,98,60], 排序后的結(jié)果為 [12,60,76,98], 插入操作如下: i=3 [K1=76]有序 , K3 =12向前插; i=5 [12,76]有序 , K5 =98不移動; i=7 [12,76,98]有序 , K7 =60向前插 。 (j=0)) { r[j+k]=r[j]; j=jk;} r[j+k]=r[0]; } k=k/2; } }/*shellsort*/ 第 9章 排 序 此算法外層循環(huán)是增量由 n/2逐步縮小到 1的循環(huán) 。算法如下: d1= 4 76 81 60 22 98 33 12 79d2= 2 76 33 12 22 98 81 60 79d3= 4 12 22 60 33 76 79 98 81結(jié)果 12 22 33 66 76 79 81 98圖 希爾排序示例 第 9章 排 序 算法 void shellsort(node r[?], int n) { k=n/2; /*k值代表前文中的 d值 */ while(k=1
點(diǎn)擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1