




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、各種排序算法總結(jié) 排序算法是最基本最常用的算法,不同的排序算法在不同的場(chǎng)景或應(yīng)用中會(huì)有不 同的表現(xiàn),我們需要對(duì)各種排序算法熟練才能將它們應(yīng)用到實(shí)際當(dāng)中,才能更好 地發(fā)揮它們的優(yōu)勢(shì)。今天,來(lái)總結(jié)下各種排序算法。 下面這個(gè)表格總結(jié)了各種排序算法的復(fù)雜度與穩(wěn)定性: 研壞旦亍展 O(n2 I O(TI?) 0(1) 雷報(bào)沖 O(ns) 0( O1 0(n2) 如) 0(1) 快盹5 O(n/cgn) W) O(logn O(nfo7n) o 融時(shí) O(nloijn) 0(1) O(nlvtpi) O(f/) 1 o 0(噸的 O(n) 二旻列拄序 tt挪E序 卜 A:j 1 + Jb) O(Tl亠切
2、各種排序算法復(fù)雜度比較.png 冒泡排序 冒泡排序可謂是最經(jīng)典的排序算法了, 它是基于比較的排序算法,時(shí)間復(fù)雜度為 0(nA2),其優(yōu)點(diǎn)是實(shí)現(xiàn)簡(jiǎn)單,n較小時(shí)性能較好。 ?算法原理 相鄰的數(shù)據(jù)進(jìn)行兩兩比較,小數(shù)放在前面,大數(shù)放在后面,這樣一趟下來(lái), 最小的數(shù)就被排在了第一位,第二趟也是如此,如此類推,直到所有的數(shù) 據(jù)排序完成 ?C+代碼實(shí)現(xiàn) 1. void bubble_sort( int arr, int len) 2. 3. for ( int i =0; :i =i; j-) 6. 7. if (arrj arrj - 1) 8. 9. int temp = =arrj; 1; 10.ar
3、rj = arrj - 11.arrj - 12. 13. 14. 15. 選擇排序 1 = temp; 1. void seleCt_sort( int arr,int len) 2. 3. for ( int i =0; i len; i+) 4. 5. int index = i; 6. for ( int j = i +1; j len; j+) 7. 8. if (arrj arrindex) 9. index = j; 10. 11. if (index != i) 12. 13. int temp = arri; 14. arri = arrindex; 15. arrindex
4、 = temp; 16. 17. 18. ? 算法原理 先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然 后,再?gòu)氖S辔磁判蛟刂欣^續(xù)尋找最小(大)元素,然后放到已排序序 列的末尾。以此類推,直到所有元素均排序完畢。 ?C+代碼實(shí)現(xiàn) 插入排序 ? 算法原理 將數(shù)據(jù)分為兩部分, 有序部分與無(wú)序部分, 一開(kāi)始有序部分包含第 1 個(gè)元 素,依次將無(wú)序的元素插入到有序部分, 直到所有元素有序。 插入排序又 分為直接插入排序、 二分插入排序、 鏈表插入等, 這里只討論直接插入排 序。它是穩(wěn)定的排序算法,時(shí)間復(fù)雜度為 0(n A2) ?C+代碼實(shí)現(xiàn) 1. void insert_sort(
5、 2. int arr, int len) 3. for ( int i =1; i - 1 10. j - J 11. 12. arrj + 1 = k; 13. 14. 快速排序 ? 算法原理 快速排序是目前在實(shí)踐中非常高效的一種排序算法, 它不是穩(wěn)定的排序算 法,平均時(shí)間復(fù)雜度為0(nlogn),最差情況下復(fù)雜度為0(nA2)。它的基 本思想是: 通過(guò)一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨(dú)立的兩部分, 其中一部 分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小, 然后再按此方法對(duì)這兩 部分?jǐn)?shù)據(jù)分別進(jìn)行快速排序, 整個(gè)排序過(guò)程可以遞歸進(jìn)行, 以此達(dá)到整個(gè) 數(shù)據(jù)變成有序序列。 ?C+代碼實(shí)現(xiàn) 1. voi
6、d quiCk_sort(int arr, int left, 2. 3. if (left right) 4. 5. int i = left, j = right, target = arrleft; 6. while (i j) 7. 8. while (i target) 9. j-; 10. if (i j) 11. arri+ = arrj; 12. 13. while (i j 15. if (i j) 16. arrj = arri; 17. 18. arri = target; 19. quiCk_sort(arr, left, i - 1); 20. quiCk_sort(
7、arr, i + 1, right); 21. int right) 22. 歸并排序 ? 算法原理 歸并排序具體工作原理如下(假設(shè)序列共有 n 個(gè)元素): o 將序列每相鄰兩個(gè)數(shù)字進(jìn)行歸并操作( merge) ,形成 floor(n/2) 個(gè)序列,排序后每個(gè)序列包含兩個(gè)元素 o 將上述序列再次歸并,形成 floor(n/4) 個(gè)序列,每個(gè)序列包含四 個(gè)元素 o 重復(fù)步驟 2,直到所有元素排序完畢 歸并排序是穩(wěn)定的排序算法,其時(shí)間復(fù)雜度為 O(nlogn) ,如果是 使用鏈表的實(shí)現(xiàn)的話,空間復(fù)雜度可以達(dá)到 O(1) ,但如果是使用 數(shù)組來(lái)存儲(chǔ)數(shù)據(jù)的話, 在歸并的過(guò)程中, 需要臨時(shí)空間來(lái)存儲(chǔ)歸并
8、 好的數(shù)據(jù),所以空間復(fù)雜度為 O(n) ?C+代碼實(shí)現(xiàn) 1. void merge( int arr, int temp_arr, int start_inde x, int mid_index, int end_index) 2. 3. int i = start_index, j = mid_index + 1; 4. int k = 0; 5. while (i mid_index + 1 9. else 10. temp_arrk+ = arri+; 11. 12. while (i mid_index + 1) 13. 14. temp_arrk+ = arri+; 15. 16.
9、while (j end_index + 1) 17. temp_arrk+ = arrj+; 18. 19. for (i =0, j = start_index; j end_index + 1 ; i +, j +) 20. arrj = temp_arri; 21. 22. 23. void merge_sort( int arr, int temp_arr, int sta rt_index, int end_index) 24. 25. if (startndex end_in dex) 26. 27. int mid_i ndex = (startndex + end_in de
10、x) / 2; 28. merge_sort(arr, temp_arr, startndex, mid _in dex); 29. merge_sort(arr, temp_arr, mid_i ndex +1, e nd_in dex); 30. merge(arr, temp_arr, startndex, midnde x, end_in dex); 31. 32. 堆排序 二叉堆 二叉堆是完全二叉樹(shù)或者近似完全二叉樹(shù),滿足兩個(gè)特性 ?父結(jié)點(diǎn)的鍵值總是大于或等于(小于或等于)任何一個(gè)子節(jié)點(diǎn)的鍵值 ?每個(gè)結(jié)點(diǎn)的左子樹(shù)和右子樹(shù)都是一個(gè)二叉堆 當(dāng)父結(jié)點(diǎn)的鍵值總是大于或等于任何一個(gè)子節(jié)點(diǎn)的鍵值
11、時(shí)為最大堆。當(dāng)父結(jié)點(diǎn)的 鍵值總是小于或等于任何一個(gè)子節(jié)點(diǎn)的鍵值時(shí)為最小堆。一般二叉樹(shù)簡(jiǎn)稱為堆。 堆的存儲(chǔ) 一般都是數(shù)組來(lái)存儲(chǔ)堆,i結(jié)點(diǎn)的父結(jié)點(diǎn)下標(biāo)就為(i - 1) / 2 。它的左右子結(jié) 點(diǎn)下標(biāo)分別為2* i + 1 和2*i + 2 。如第0個(gè)結(jié)點(diǎn)左右子結(jié)點(diǎn)下標(biāo)分別為1 和2。存儲(chǔ)結(jié)構(gòu)如圖所示: 12 ;.n 42 * 50 / 如果較大的子結(jié)點(diǎn)大于父結(jié)點(diǎn)那么把較大的子結(jié)點(diǎn)往上 堆結(jié)構(gòu) .png 堆排序原理 堆排序的時(shí)間復(fù)雜度為 O(nlogn) ? 算法原理(以最大堆為例) o 先將初始數(shù)據(jù) R1.n 建成一個(gè)最大堆,此堆為初始的無(wú)序區(qū) o 再將關(guān)鍵字最大的記錄 R1 (即堆頂)和無(wú)序區(qū)
12、的最后一個(gè)記錄 Rn 交換,由此得到新的無(wú)序區(qū) R1.n-1 和有序區(qū) Rn ,且滿足 R1.n-1.keys Rn.key o 由于交換后新的根 R1 可能違反堆性質(zhì),故應(yīng)將當(dāng)前無(wú)序區(qū) R1.n-1 調(diào)整為堆。 o 重復(fù) 2、 3 步驟,直到無(wú)序區(qū)只有一個(gè)元素為止。 ?C+代碼實(shí)現(xiàn) 1. /* 2. * 將數(shù)組 arr 構(gòu)建大根堆 3. * param arr 待調(diào)整的數(shù)組 4. * param i 待調(diào)整的數(shù)組元素的下標(biāo) 5. * param len 數(shù)組的長(zhǎng)度 6. */ 7. void heap_adjust(int arr, int i, int len) 8. 9. int Chi
13、ld; 10. int temp; 11. 12. for (; 2 * i +1 len; i = Child) 13. 14. Child = 2 * i + 1 ; / 子結(jié)點(diǎn)的位置 結(jié)點(diǎn)的位置 + 1 15. / 得到子結(jié)點(diǎn)中鍵值較大的結(jié)點(diǎn) 16. if (Child arr = 2 * 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 移動(dòng),替換它的父結(jié)點(diǎn) if (arri =0; i-) heap_adjust(arr, i, len); for (i = len -1; i 0; i-) / 將第 1 個(gè)元素與當(dāng)前最后一個(gè)元素交換,保證當(dāng)前的最 后一個(gè)位置的元素都是現(xiàn)在的這個(gè)序列中最大的 int temp = arr0; arr 0 = ar
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年元宇宙社交平臺(tái)虛擬社交圈層構(gòu)建與用戶體驗(yàn)研究報(bào)告
- 2025年醫(yī)院信息化建設(shè)中的電子病歷系統(tǒng)優(yōu)化:醫(yī)療信息化產(chǎn)業(yè)發(fā)展現(xiàn)狀與趨勢(shì)分析報(bào)告001
- 水電行業(yè)2025年技術(shù)進(jìn)步動(dòng)態(tài)與大型水電項(xiàng)目投資效益研究報(bào)告
- 政策導(dǎo)向下農(nóng)業(yè)綠色發(fā)展技術(shù)與農(nóng)村生態(tài)環(huán)境治理模式創(chuàng)新與實(shí)施效果研究
- 探索2025年:有聲讀物市場(chǎng)需求與內(nèi)容創(chuàng)作模式創(chuàng)新研究報(bào)告
- 2025年二手交易電商平臺(tái)信用評(píng)價(jià)體系深度研究報(bào)告
- 2025年醫(yī)藥企業(yè)研發(fā)外包(CRO)模式藥物研發(fā)生物技術(shù)產(chǎn)品研發(fā)報(bào)告001
- 2025年醫(yī)藥企業(yè)研發(fā)外包(CRO)綠色研發(fā)與環(huán)保要求報(bào)告
- 2025年醫(yī)藥流通行業(yè)報(bào)告:線上線下融合與市場(chǎng)格局變化
- 乳制品創(chuàng)新產(chǎn)業(yè)提升建設(shè)項(xiàng)目可行性研究報(bào)告寫作模板-申批備案
- T/CSPSTC 112-2023氫氣管道工程施工技術(shù)規(guī)范
- 24春國(guó)家開(kāi)放大學(xué)《農(nóng)業(yè)推廣》調(diào)查報(bào)告參考答案
- 2022版義務(wù)教育(勞動(dòng))課程標(biāo)準(zhǔn)(含2022年修訂部分)
- 洛陽(yáng)市中小學(xué)教師師德師風(fēng)考核內(nèi)容和評(píng)分細(xì)則
- 承包商資質(zhì)審查表
- 應(yīng)急救援物資檢查維護(hù)保養(yǎng)記錄表(月度)
- 機(jī)械原理課程設(shè)計(jì)-沖壓機(jī)構(gòu)及送料機(jī)構(gòu)設(shè)計(jì)說(shuō)明書(shū)
- 押金收據(jù)條(通用版)
- [甘肅]最新甘肅省造價(jià)文件匯編(310頁(yè))
- 鋼框架結(jié)構(gòu)計(jì)算書(shū)畢業(yè)設(shè)計(jì)
- 品牌中國(guó)產(chǎn)業(yè)聯(lián)盟簡(jiǎn)介ppt課件
評(píng)論
0/150
提交評(píng)論