




已閱讀5頁,還剩18頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
選擇排序 Selectionsort 1 選擇排序 Selectionsort 是以選擇為基礎(chǔ)的一種常用排序方法 從記錄的無序子序列中 選擇 關(guān)鍵字最小或最大的記錄 并將其加入到有序子序列的一端 以增加記錄的有序子序列的長度 它也有幾種不同的實現(xiàn)方法 這里僅介紹簡單選擇排序 樹形排序和堆排序 2 1 簡單選擇排序 1 算法描述簡單選擇排序算法的基本思路 對于一組關(guān)鍵字 Kl K2 Kn 將其由小到大進(jìn)行排序 首先從Kl K2 Kn中選擇最小值 假設(shè)是Kk 則將Kk與K1對換 然后從K2 K3 Kn中選擇最小值Kk 1 再將Kk 1與K2對換 如此進(jìn)行選擇和調(diào)換 對第i趟選擇排序 進(jìn)行n i次關(guān)鍵字比較 從n i 1個記錄中選出關(guān)鍵字最小的記錄 并與第i個記錄交換 令i從1至n 1 進(jìn)行n 1趟選擇排序 一個由小到大的有序序列就形成了 3 例1設(shè)有一組關(guān)鍵字 49 39 66 49 76 11 27 96 這里n 8 試用簡單選擇排序方法 將這組記錄由小到大進(jìn)行排序 其排序過程如圖所示 4 算法實現(xiàn)如下 voidSelectSort SqList SelectSort 5 2 算法分析在簡單選擇排序中 無論待排序的記錄初始序列是否有序 都需要執(zhí)行n n 1 2次關(guān)鍵字的比較操作 如果待排序的記錄初始序列就是已經(jīng)排好序的正列 則無須移動記錄 因為每個元素都位于其最終位置上了 而如果待排序的記錄初始序列是逆序 即在最壞情況下 則要做3 n 1 次記錄移動 所以 簡單選擇排序的時間復(fù)雜度是O n n 由上面的例1很顯然看到 49在排序前位于49 的前面 而經(jīng)簡單選擇排序后卻位于49 后面了 它們的相對位置發(fā)生了顛倒 因此簡單選擇排序算法是不穩(wěn)定排序算法 6 3 堆排序 1 堆的定義堆是一個記錄序列 k1 k2 kn 對于列表中位置i 編號從1開始 處的記錄的關(guān)鍵字ki 當(dāng)且僅當(dāng)滿足下列關(guān)系時 稱之為堆 ki k2i或ki k2iki k2i 1ki k2i 1 i 1 2 n 2 其中 每個結(jié)點關(guān)鍵字都不小于其子孫結(jié)點關(guān)鍵字的堆稱為 大根堆 而每個結(jié)點關(guān)鍵字都不小于其子孫結(jié)點關(guān)鍵字的堆稱為 小根堆 下面的討論中以小根堆為例 7 判斷下列序列是否為堆 100 85 98 77 80 60 82 40 20 15 67 100 98 85 82 80 77 60 40 20 15 67 15 20 40 60 67 77 80 82 85 98 100 8 我們已經(jīng)知道 對于一棵有n個結(jié)點的完全二叉樹 當(dāng)它的結(jié)點由上而下 自左至右編號之后 編號為1 n 2 的結(jié)點為分支結(jié)點 編號大于 n 2 的結(jié)點為葉子結(jié)點 對于每個編號為i的分支結(jié)點 它的左孩子的編號為2i 它的右孩子的編號為2i 1 對于每個編號為i i 1 的結(jié)點 它的雙親的編號為 i 2 因此 我們還可以借助完全二叉樹來描述堆的概念 若完全二叉樹中任一非葉子結(jié)點的值均小于等于 或大于等于 其左 右孩子結(jié)點的值 則從根結(jié)點開始按結(jié)點編號排列所得的結(jié)點序列就是一個堆 9 10 2 算法描述堆頂記錄對應(yīng)完全二叉樹的根結(jié)點 堆頂記錄關(guān)鍵字是所有記錄關(guān)鍵字的最值 堆排序就是利用堆的上述特征完成排序的 在輸出堆頂?shù)淖畲?或最小 之后 使得剩余的n 1個記錄的序列重新調(diào)整為一個堆 于是又得到次大 或次小 值 如此反復(fù)執(zhí)行 直至所以記錄都排序為一個有序序列 這就是堆排序 HeapSort 11 由于初始記錄序列不一定滿足堆關(guān)系 因此堆排序過程大體分兩步處理 初建堆 從堆的定義出發(fā) 先取i n 2 它一定是第n個結(jié)點雙親的編號 將以i結(jié)點為根的子樹調(diào)整成為堆 然后令i i 1 再將以i結(jié)點為根的子樹調(diào)整成為堆 此時可能會反復(fù)調(diào)整某些結(jié)點 直到i 1為止 堆初建完成 堆排序 首先輸出堆頂元素 一般是最小值 讓堆中最后一個元素上移到原堆頂位置 然后恢復(fù)堆 因為經(jīng)過第一步輸出堆頂元素的操作后 往往破壞了原來的堆關(guān)系 所以要恢復(fù)堆 重復(fù)執(zhí)行輸出堆頂元素 堆尾元素上移和恢復(fù)堆的操作 直到全部元素輸出完為止 按輸出元素的前后次序排列 就形成了有序序列 完成了堆排序的操作 12 例設(shè)有n個記錄 n 8 的關(guān)鍵字是 30 50 60 35 86 10 40 45 試用堆排序方法 將這組記錄由小到大進(jìn)行排序 13 第一步 初始建堆 其建堆過程如圖所示 因為n 8 所以從i 4開始 14 第二步 堆排序 這是一個反復(fù)輸出堆頂元素 將堆尾元素移至堆頂 再調(diào)整恢復(fù)堆的過程 恢復(fù)堆的過程與初建堆中i 1時所進(jìn)行的操作完全相同 請注意 每輸出一次堆頂元素 堆尾的邏輯位置退1 直到堆中剩下一個元素為止 排序過程如圖所示 15 16 輸出序列 1030354045506086 17 由上可知 調(diào)整恢復(fù)堆操作過程要被多次反復(fù)調(diào)用 即當(dāng)i值確定之后 以ki為比較參照值 與其左 右孩子的關(guān)鍵字比較和調(diào)整 使以結(jié)點i為根的子樹成為堆 因此把此過程設(shè)計成函數(shù)Heap voidHeap RedTyper inti intm i是根結(jié)點編號 m是以i結(jié)點為根的子樹的最后一個結(jié)點編號 x r i j 2 i x保存根記錄的內(nèi)容 j為左孩子編號 while j m if j m r j key r j 1 key j 當(dāng)結(jié)點i有左 右兩個孩子時 j取關(guān)鍵字值較小的孩子結(jié)點編號 if r j key x key r i r j i j j 2 i 向下一層探測 elsej m 1 x key小于左 右孩于的關(guān)鍵字 強(qiáng)制使j m 以便結(jié)束循環(huán) r i x Heap 18 另外 還需要設(shè)計一個主體算法 使在初建堆階段 讓i從 n 2 變化到1 循環(huán)調(diào)用heap函數(shù) 而在堆排序階段 每輸出一次堆頂元素 將堆尾元素移至堆頂之后 就要調(diào)用一次heap函數(shù)來恢復(fù)堆 主體算法由函數(shù)Heapsort來實現(xiàn) voidHeapsort RedTyper intn n為文件的實際記錄數(shù) r o 沒有使用 for i n 2 i 1 i Heap r i n 初建堆 for v n v 2 v x r 1 r 1 r v r v x 堆頂堆尾元素對換 Heap r 1 v 1 本次比上次少處理一個記錄 Heapsort 19 3 算法分析在堆排序圖示例中 堆越畫越小 堆中結(jié)點越來越少 實際上 在用來存儲堆的數(shù)組中堆頂元素輸出之后并未刪除 而是與堆尾元素對換 從圖示看輸出的是一個由小到大的升序序列 實際最后數(shù)組中記錄的關(guān)鍵字從r l key到r n key是一個由大到小的降序序列 算法Heap的時間復(fù)雜度與堆所對應(yīng)的完全二叉樹的樹深log2n相關(guān) 而算法Heapsort中對Heap的調(diào)用數(shù)量級為n 所以整個堆排序的時間復(fù)雜度為O nlog2n 20 穩(wěn)定性如何 21 判斷下列序列是否為堆 若不是 則把
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年深圳房屋租賃的合同范本
- 2025牛買賣合同范文
- 2025物業(yè)裝修合同示范文本
- 2025深圳萬科東郡北區(qū)園林景觀設(shè)計顧問合同
- 2025建筑工程施工合同示范文本(房建工程)
- 2025化工原料供應(yīng)協(xié)議合同范本
- 【7道期中】安徽省安慶市潛山市十校聯(lián)考2023-2024學(xué)年七年級下學(xué)期4月期中道德與法治試題
- 2025辦公房屋租賃合同范本「版」
- 2025建筑工程土方回填項目合同
- 重慶市沙坪壩區(qū)九年級歷史上冊 世界古代史 第五學(xué)習(xí)主題 古代科學(xué)技術(shù)與思想文化 第10課 古代的科學(xué)技術(shù)與造型藝術(shù)教學(xué)設(shè)計 川教版
- DBJ33T 1307-2023 微型鋼管樁加固技術(shù)規(guī)程
- 邏輯哲學(xué)論中文版分享
- 廣東省深圳市南山區(qū)2023-2024學(xué)年六年級上學(xué)期英語期末試卷
- 2025年八省聯(lián)考高考數(shù)學(xué)試卷評析及復(fù)習(xí)備考指導(dǎo)課件
- 無人機(jī)應(yīng)聘面試簡歷
- 日立電梯LCA故障代碼
- 第9課 兩宋的政治和軍事課件-高中歷史統(tǒng)編版(2019)必修中外歷史綱要上冊
- 民間非營利組織會計制度
- 2023年北京中考地理試卷
- 山東省日照市莒縣2020-2021學(xué)年高二下學(xué)期期中考試化學(xué)試題
- 2025中國鐵路蘭州局集團(tuán)限公司招聘普通高校畢業(yè)生540人(二)管理單位筆試遴選500模擬題附帶答案詳解
評論
0/150
提交評論