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

正文內(nèi)容

算法與數(shù)據(jù)結(jié)構(gòu)第8章排序及基本算法ppt-文庫(kù)吧資料

2025-01-27 21:44本頁(yè)面
  

【正文】 一個(gè)新堆 ? 即堆調(diào)整問(wèn)題 。 堆排序舉例 ?例如關(guān)鍵字序列 ( 12, 15, 35, 25, 39, 67) 和序列 ( 75, 38, 62, 28, 18, 49) 都是堆 , 前者是最小值根堆而后者是最大值根堆 , 其對(duì)應(yīng)的完全二叉樹分別如下圖的 (a)和 (b)所示 。 ?如果將與此序列對(duì)應(yīng)的一維數(shù)組看成是一棵完全二叉樹 , 則堆的含義表明完全二叉樹中任一非終端結(jié)點(diǎn)上的數(shù)據(jù)值均不大于 ( 或不小于 ) 其左孩子和右孩子結(jié)點(diǎn)的值 。 選擇排序 直接選擇排序 樹形選擇排序 堆排序 堆排序 ?為了克服樹形選擇排序需要較多輔助空間保存比較結(jié)果和與進(jìn)行多余比較的缺點(diǎn); ?在 1964年威洛姆斯 ( ) 和弗洛伊德( Floyd) 對(duì)樹形選擇排序進(jìn)行了改進(jìn) , 提出了新的排序方法 ——堆排序 ( heap sort) 方法 , 使其比較次數(shù)達(dá)到樹形選擇排序的水平 , 同時(shí)又不會(huì)增加額外的存儲(chǔ)開銷 , 只需一個(gè)記錄大小的空間用于記錄間的交換 。 ?總的比較次數(shù)至多為 ,所以其時(shí)間復(fù)雜度為 O(nlog2n)。 接下來(lái)將最小關(guān)鍵字值改為 , 然后沿該結(jié)點(diǎn)到樹根的路徑依次進(jìn)行各分枝結(jié)點(diǎn)子女之間的比較 , 上升到根結(jié)點(diǎn)的是次小關(guān)鍵字值的記錄 , 如下圖 (b)所示;如此繼續(xù)進(jìn)行下去 , 直到所有記錄都已選出時(shí)為止 。 ?樹形選擇排序 是將待排序的 n個(gè)記錄的關(guān)鍵字作為完全二叉樹的葉子結(jié)點(diǎn) , 依次兩兩之間比較 , 關(guān)鍵字值小者作為其雙親結(jié)點(diǎn) , 最后若余下一個(gè)則輪空參加下一輪比較;然后對(duì)得到的這些雙親結(jié)點(diǎn)再兩兩之間比較產(chǎn)生其雙親結(jié)點(diǎn) ( 小者 ) …… 如此經(jīng)過(guò) 輪比較后 , 關(guān)鍵字值最小的記錄就在根結(jié)點(diǎn)位置 。 選擇排序 直接選擇排序 樹形選擇排序 堆排序 樹形選擇排序 ?樹形選擇排序 ( tree selection sort) 也稱作 錦標(biāo)賽排序 ( tournament sort) , 這種排序方法是按照錦標(biāo)賽的思路進(jìn)行的 。 由此得到直接選擇排序的時(shí)間復(fù)雜度為 O(n2)。 } } } /*selectsort end*/ 直接選擇排序的算法分析 ?直接選擇排序只需要一個(gè)記錄大小的輔助存儲(chǔ)空間用于記錄交換 , 其空間復(fù)雜度為 O(1)。 R[i]=R[m]。j++) if(R[j].keyR[m].key) m=j。 for(j=i+1。i=n1。 recordtype temp。 ?其 具體做法 是: ?對(duì)于待排序文件 R[1..n], 通過(guò)比較首先選出關(guān)鍵字值最小的記錄與 R[1]交換 , ?然后在其余記錄中選出次小關(guān)鍵字的記錄與R[2]交換 …… ?如此進(jìn)行 n1次的選擇與交換 , R[1..n]中所有記錄就按關(guān)鍵字升序次序排列完畢 。 ?本節(jié)介紹: ?直接選擇排序 ?樹型選擇排序 ?堆排序 。 ?快速排序算法是一種 不穩(wěn)定的排序 方法 。 ?為了避免初始關(guān)鍵字序列有序或基本有序時(shí)快速排序蛻化為冒泡排序 ( 即基準(zhǔn)二叉樹為單枝或近似單枝二叉樹 ) 的情況 , 通常采取 “ 三者取中 ” 的基準(zhǔn)記錄選取辦法改進(jìn)之 。 快速排序的算法分析(續(xù)) ?在 最壞情況 下 , 基準(zhǔn)二叉樹是一棵單枝二叉檢索樹 , 深度為 n, 存儲(chǔ)開銷為 O(n), 時(shí)間開銷為 O(n2)。 ?快速排序的基準(zhǔn)二叉樹是關(guān)鍵字的一棵二叉檢索樹 , 其中序遍歷序列就是關(guān)鍵字的升序排列 。 快速排序的算法舉例(續(xù)) 快速排序的算法舉例(續(xù)) 快速排序的算法舉例(續(xù)) 快速排序的算法分析 ?快速排序過(guò)程中各趟中所選擇的基準(zhǔn)可以用一棵二叉樹來(lái)表示 , 如上例中的基準(zhǔn)二叉樹如右圖所示 。 quicksort(R,i+1,t)。 if(st) {i=divideareasort(R,s,t)。 } /*divideareasort end*/ 快速排序的算法描述(續(xù)) ? 對(duì)于待排序文件 R[]利用一次分割區(qū)間排序算法時(shí) , 令 s=1和 t=n即可完成第一趟排序;由此得到的兩個(gè)更小的區(qū)間R[1… i1]和 R[i+1… n], 繼續(xù)利用算法 divideareasort分割為更小的四個(gè)區(qū)間;如此一直進(jìn)行下去 , 直到都分割為只有一個(gè)記錄時(shí)排序結(jié)束 。 R[i]=temp。 j。(ij)) i++。} 快速排序的算法描述(續(xù)) while((R[i].key=)amp。 if(ij) {R[i]=R[j]。amp。 temp=R[s]。 i=s。 快速排序的算法描述 ?這種把一個(gè)待排序區(qū)間通過(guò)基準(zhǔn)記錄 ( 第一個(gè)記錄 ) 分割成為兩個(gè)區(qū)間的一次分割排序算法如下: int divideareasort(recordtype R[],int s,int t) {int i,j。 ?快速排序的 基本思想 是: ?在待排序文件的 n個(gè)記錄中 , 任取一個(gè)記錄 ( 通常是選取第一個(gè)記錄 ) 作為基準(zhǔn); ?經(jīng)過(guò)一趟排序后以基準(zhǔn)記錄的關(guān)鍵字把全部記錄分為兩部分 , 所有關(guān)鍵字值比基準(zhǔn)記錄關(guān)鍵字值小的記錄都排列在基準(zhǔn)記錄之前 , 而所有關(guān)鍵字值比基準(zhǔn)記錄關(guān)鍵字值大的記錄都排列在基準(zhǔn)記錄之后; ?然后對(duì)基準(zhǔn)記錄前后的這兩個(gè)部分分別重復(fù)這樣的過(guò)程 ,得到本趟排序的兩個(gè)新到位的基準(zhǔn)和四個(gè)部分 …… 如此重復(fù)上述過(guò)程 , 直到每一個(gè)部分只剩下一個(gè)記錄 ( 即全部到位 ) 時(shí)為止 。 交換排序 冒泡排序 快速排序 快速排序 ?快速排序 ( quick sort) 也稱作分區(qū)交換排序 , 是對(duì)冒泡排序的一種改進(jìn)排序方法 。 由后向前掃描比較交換一趟 , 可使最輕的氣泡上浮到頂部 , 但只能使最重的氣泡下沉一個(gè)位置;由前向后掃描比較交換一趟 , 可使最重的氣泡下沉到底部 , 但只能使最輕的氣泡上浮一個(gè)位置 。 冒泡排序算法分析(續(xù)) ?上述的冒泡排序算法還可以作一些改進(jìn)來(lái)提高排序速度 , 比如: ?在每趟排序中記住最后一次發(fā)生交換記錄的位置 K, 因?yàn)槲恢?K之前的記錄都已排好了序 , 下一趟的排序可以終止于位置 K而不必進(jìn)行到預(yù)定的下界位置 i。 ?其時(shí)間復(fù)雜度可以如下分析: ?在最好的情況下 , 是初始記錄的關(guān)鍵字已遞增有序時(shí) ,只需一趟排序 , 比較次數(shù)為 n1, 沒(méi)有交換記錄即記錄的移動(dòng)次數(shù)為 0; ?在最壞的情況下 , 是初始記錄遞減有序 ( 即逆序 ) 時(shí) ,需進(jìn)行 n1趟排序 , 比較次數(shù)為 , 交換次數(shù)為 , 每次交換需三次移動(dòng)記錄 , 其移動(dòng)次數(shù)為 。 } /*置已交換標(biāo)志 */ if(flag==0) break。 R[j]=temp。j) if(R[j1].key R[j].key) {temp=R[j1]。 for(j = n。in1。 recordtype temp。 ?為此 , 需在算法中引入一個(gè)交換狀態(tài)變量 flag, 在每一趟排序之前置 flag為 0, 每次交換時(shí)給 flag加 1,若一趟結(jié)束時(shí) flag為 0則終止算法 。 冒泡排序算法舉例 ?例如 , 對(duì)于 8個(gè)記錄的關(guān)鍵字序列 ( 46, 26, 43, 18,74, 21, ,57) , 冒泡排序的過(guò)程如下圖所示: 冒泡排序算法(續(xù)) ?由該冒泡排序的實(shí)例 , 也證實(shí)了至多需要 n1趟冒泡排序即可完成整個(gè)排序 。 然后對(duì) n1個(gè)記錄重復(fù)類似的操作 , 次小關(guān)鍵字值的記錄上浮到 R[2]的位置上 。 ?它是通過(guò)相鄰記錄之間的關(guān)鍵字比較和記錄交換 ,使關(guān)鍵字值較小的記錄由底部向上移動(dòng) , 而關(guān)鍵字值較大的記錄由頂部向下移動(dòng) , 就象水中的氣泡向上飄浮 ( 冒泡 ) 一樣 。 ?本節(jié)介紹兩種交換排序的方法: ?一種是冒泡排序 , ?一種是快速排序 。 ?共享?xiàng)2迦肱判蚴且环N 穩(wěn)定的排序 方法 。 共享?xiàng)2迦肱判蚺e例 共享?xiàng)2迦肱判蚺e例(續(xù)) 共享?xiàng)2迦肱判颍ɡm(xù)) ?共享?xiàng)2迦肱判虿恍枰黾宇~外的存儲(chǔ)開銷 , 在時(shí)間性能上與二路插入排序相當(dāng) , 而且有效地避免了因 R[1]為待排序記錄中關(guān)鍵字值為最大或最小記錄時(shí)完全失去優(yōu)越性的不足 。 ?當(dāng) R[i].key[top2].key時(shí) , 由棧 2反復(fù)傳送記錄到棧 1,直到 R[i].key≤[top2].key時(shí)將 R[i]插入棧 2。 ?當(dāng) R[i].key[top1].key時(shí) , 由棧 1反復(fù)傳送記錄到棧 2,直到 R[i].key≥R[top1].key時(shí)將 R[i]插入棧 1。 共享?xiàng)2迦肱判颍ɡm(xù)) ?為此需要區(qū)分以下三種情況并作相應(yīng)處理: ?當(dāng)待插入記錄 R[i]的關(guān)鍵字值不小于棧 1 的棧頂記錄的關(guān)鍵字值且不大于棧 2的棧頂記錄的關(guān)鍵字值時(shí) , 將待插記錄壓 入 棧 1 中 。 ?其基本思想是: ?把待排序的記錄數(shù)組 R看作是一個(gè)靜態(tài)的共享?xiàng)?( 棧 1和棧 2) , 棧 1按數(shù)組下標(biāo)由小到大方向增長(zhǎng) , 棧 2按數(shù)組下標(biāo)由大到小方向增長(zhǎng);棧 1中按關(guān)鍵字升序排列壓入待排序記錄 , 棧 2中按關(guān)鍵字降序排列壓入待排序記錄 。 ?二路插入排序 , 是一種 穩(wěn)定的排序 方法 。 它只能減少移動(dòng)次數(shù)而不能絕對(duì)避免移動(dòng)記錄 , 若要大幅度降低移動(dòng)次數(shù) , 可改變存儲(chǔ)結(jié)構(gòu)為靜態(tài)鏈表 , 進(jìn)行表插入排序 。 ?在算法實(shí)現(xiàn)時(shí) , 把 S數(shù)組看成是一個(gè)循環(huán)數(shù)組 , 并設(shè)兩個(gè)指針 first和 final分別指示排序過(guò)程中得到的有序序列中的第一個(gè)記錄和最后一個(gè)記錄在 S中的位置 。 ?二路插入排序 ( 2way insertion sort) 是在二分法插入排序基礎(chǔ)上的進(jìn)一步改進(jìn) , 改進(jìn)的目標(biāo)是減少排序過(guò)程中記錄的移動(dòng)次數(shù) , 但為此多開銷了 n個(gè)記錄大小的輔助存儲(chǔ)空間 。 我們把經(jīng)過(guò)這種改進(jìn)后的插入排序方法 , 稱作 二分法插入排序 ( binary insertion sort) 。 插入排序 直接插入排序 希爾排序 其它插入排序簡(jiǎn)介 ? 由第七章的討論我們知道 , 對(duì)有序表采用二分法檢索 , 檢索性能大大優(yōu)于順序檢索 。 ?內(nèi)層的 while循環(huán)確定各組中每個(gè)記錄的插入位置 , 進(jìn)行關(guān)鍵字的比較和記錄的移動(dòng)操作; 希爾排序的算法分析 (續(xù)) ?在最好的情況下只執(zhí)行一次比較而無(wú)記錄移動(dòng) , 其一趟中總 的 比 較 次 數(shù) 與 中 層 for 循 環(huán) 的 執(zhí) 行 次 數(shù) 相 同 ,為 ; ?而一趟中執(zhí)行插入的次數(shù)為 ndi, 即平均比較次數(shù)不超過(guò) ,更不會(huì)超過(guò) log2n次; ?由于希爾排序算法中開始時(shí)兩個(gè)記錄一組 , 以后隨著組數(shù)的減少組中記錄增多也逐步基本有序 , 所以在 n較大時(shí)的其它情況下的平均比較次數(shù)也是接近于最好情況下的次數(shù) log2n或是它的線性函數(shù) , 而移動(dòng)次數(shù)或平均移動(dòng)次數(shù)是遠(yuǎn)遠(yuǎn)小于比較次數(shù)和平均比較次數(shù)的; ?由此得內(nèi)層 while循環(huán)的平均執(zhí)行次數(shù)為 O(log2n)階函數(shù) 。 算法中的主要時(shí)間開銷在于三重循環(huán): ?外層 dowhile循環(huán)控制排序趟數(shù) , 共執(zhí)行 log2n次 。} }while(d 1)。 j = j – d。 R[0] = R[j]。i=d+n。 do {d = (d+1)/2。i++) R[i].key = maxint。 for(i=1。 這種監(jiān)視哨的設(shè)置方法 , 沒(méi)有在監(jiān)視哨中保存各組中的一個(gè)個(gè)待插入記錄 , 但可以統(tǒng)一保存待插入記錄于R[0]中 。 對(duì)于增量為 d的一趟希爾排序 , 待排序文件被分成 d 組 , 各組中記錄之間的距離為 d;需要在 R[1]到 R[d]處設(shè)置監(jiān)視哨 , 而在 R[d+1]到 R[d+n]處安排待排序文件中的 n個(gè)記錄 。 ?另外 , 在 for循環(huán)中的分組執(zhí)行直接插入排序的過(guò)程 ,是依次先插入 d個(gè)組中的第二個(gè)記錄 , 再插入 d個(gè)組中的第三個(gè)記錄 …… 最后插入 d個(gè)組中的最后一個(gè)記錄;是 d個(gè)組的交替插入過(guò)程 , 而不是一個(gè)組的直接插入排序完成后再進(jìn)行下一組 , 這樣有利于算法設(shè)計(jì)的簡(jiǎn)潔性和算法描述的方便性 。 } }while(d 1)。 j
點(diǎn)擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1