版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上各種排序算法總結(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)定性:各種排序算法復(fù)雜度比較.png冒泡排序冒泡排序可謂是最經(jīng)典的排序算法了,它是基于比較的排序算法,時(shí)間復(fù)雜度為O(n2),其優(yōu)點(diǎn)是實(shí)現(xiàn)簡(jiǎn)單,n較小時(shí)性能較好。· 算法原理相鄰的數(shù)據(jù)進(jìn)行兩兩比較,小數(shù)放在前面,大數(shù)放在后面,這樣一趟下來(lái),最小的數(shù)就被排在了第一位,第二趟也是如此,如此類(lèi)推,直到所有的數(shù)據(jù)排序完成
2、83; c+代碼實(shí)現(xiàn)1. void bubble_sort(int arr, int len) 2. 3. for (int i = 0; i < len - 1; i+) 4. 5.
3、0; for (int j = len - 1; j >= i; j-) 6. 7. if (arrj < arr
4、j - 1) 8. 9. int temp = arrj; 10.
5、60; arrj = arrj - 1; 11. arrj - 1 = temp; 12. &
6、#160; 13. 14. 15. 選擇排序· 算法原理先在未排序序列中找到最?。ù螅┰?,存放到排序序列的起始位置,然后,再?gòu)氖S辔磁判蛟刂欣^續(xù)尋找最?。ù螅┰?,然后放到已排序序列的末尾。以此類(lèi)推,直到所有元素均排序完畢。 ·
7、c+代碼實(shí)現(xiàn)1. void select_sort(int arr, int len) 2. 3. for (int i = 0; i < len; i+) 4. 5.
8、0; int index = i; 6. for (int j = i + 1; j < len; j+) 7. 8. &
9、#160; if (arrj < arrindex) 9. index = j; 10.
10、160; 11. if (index != i) 12. 13. int temp = arri;&
11、#160;14. arri = arrindex; 15. arrindex = temp; 16.
12、60; 17. 18. 插入排序· 算法原理將數(shù)據(jù)分為兩部分,有序部分與無(wú)序部分,一開(kāi)始有序部分包含第1個(gè)元素,依次將無(wú)序的元素插入到有序部分,直到所有元素有序。插入排序又分為直接插入排序、二分插入排序、鏈表插入等,這里只討論直接插入排序。它是穩(wěn)定的排序算法,時(shí)間復(fù)雜度為O(n2) · c+代碼實(shí)現(xiàn)1. void insert_sort(int arr, int len)
13、2. 3. for (int i = 1; i < len; i +) 4. 5. int j = i - 1; 6. &
14、#160; int k = arri; 7. while (j > -1 && k < arrj ) 8.
15、 9. arrj + 1 = arrj; 10. j -; 11.
16、0; 12. arrj + 1 = k; 13. 14. 快速排序· 算法原理快速排序是目前在實(shí)踐中非常高效的一種排序算法,它不是穩(wěn)定的排序算法,平均時(shí)間復(fù)雜度為O(nlogn),最差情況下復(fù)雜度為O(n2)。它的基本思想是:通過(guò)一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨(dú)立的兩部分,其中一
17、部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小,然后再按此方法對(duì)這兩部分?jǐn)?shù)據(jù)分別進(jìn)行快速排序,整個(gè)排序過(guò)程可以遞歸進(jìn)行,以此達(dá)到整個(gè)數(shù)據(jù)變成有序序列。 · c+代碼實(shí)現(xiàn)1. void quick_sort(int arr, int left, int right) 2. 3. if (left < right) 4. 5. int
18、 i = left, j = right, target = arrleft; 6. while (i < j) 7. 8. while (i <
19、60;j && arrj > target) 9. j-; 10. if (i < j) 11. &
20、#160; arri+ = arrj; 12. 13. while (i < j && arri < target) 14. &
21、#160; i+; 15. if (i < j) 16. arrj = arri; 17. 18.
22、0; arri = target; 19. quick_sort(arr, left, i - 1); 20. quick_sort(arr, i + 1, right); 21. 22. 歸并排序· 算法原理歸并排序具體
23、工作原理如下(假設(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ǔ)歸并好的數(shù)據(jù),所以空間復(fù)雜度為O(n)· c+代碼實(shí)現(xiàn)1. void merge(int arr, int
24、temp_arr, int start_index, int mid_index, int end_index) 2. 3. int i = start_index, j = mid_index + 1; 4. int k = 0; 5.
25、160; while (i < mid_index + 1 && j < end_index + 1) 6. 7. if (arri > arrj) 8.
26、 temp_arrk+ = arrj+; 9. else 10. temp_arrk+ = arri+; 11.
27、; 12. while (i < mid_index + 1) 13. 14. temp_arrk+ = arri+; 15. 16.
28、; while (j < end_index + 1) 17. temp_arrk+ = arrj+; 18. 19. for (i = 0, j = start_index; j < end_
29、index + 1; i +, j +) 20. arrj = temp_arri; 21. 22. 23. void merge_sort(int arr, int temp_arr, int start_index, int end_index) 2
30、4. 25. if (start_index < end_index) 26. 27. int mid_index = (start_index + end_index) / 2; 28.
31、0; merge_sort(arr, temp_arr, start_index, mid_index); 29. merge_sort(arr, temp_arr, mid_index + 1, end_index); 30.
32、0; merge(arr, temp_arr, start_index, mid_index, end_index); 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)的鍵值時(shí)為最大堆。當(dāng)父結(jié)點(diǎn)的鍵值總是小于或等于任何一個(gè)子節(jié)點(diǎn)的
33、鍵值時(shí)為最小堆。一般二叉樹(shù)簡(jiǎn)稱(chēng)為堆。堆的存儲(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)如圖所示:堆結(jié)構(gòu).png 堆排序原理堆排序的時(shí)間復(fù)雜度為O(nlogn)· 算法原理(以最大堆為例)o 先將初始數(shù)據(jù)R1.n建成一個(gè)最大堆,此堆為初始的無(wú)序區(qū) o 再將關(guān)鍵字最大的記錄R1(即堆頂)和無(wú)序區(qū)的最后一個(gè)記錄Rn交換,由此得到新的無(wú)序區(qū)R1.n-1和有序區(qū)Rn,且滿足R1.n-1.keysRn.key o 由于交換后新的根R1可能違反堆性質(zhì),故應(yīng)
34、將當(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(
35、int arr, int i, int len) 8. 9. int child; 10. int temp; 11. 12. for (; 2 * i + 1 < len; i = child) 13.
36、 14. child = 2 * i + 1; / 子結(jié)點(diǎn)的位置 = 2 * 父結(jié)點(diǎn)的位置 + 1 15. / 得到子結(jié)點(diǎn)中鍵值較大的結(jié)點(diǎn) 16.
37、0; if (child < len - 1 && arrchild + 1 > arrchild) 17. child +; 18.
38、; / 如果較大的子結(jié)點(diǎn)大于父結(jié)點(diǎn)那么把較大的子結(jié)點(diǎn)往上移動(dòng),替換它的父結(jié)點(diǎn) 19. if (arri < arrchild) 20. 21. temp =
39、;arri; 22. arri = arrchild; 23. arrchild = temp; 24. 25. else 26. break; 27. 28. 29.
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 年度財(cái)務(wù)目標(biāo)達(dá)成計(jì)劃
- 廣告行業(yè)前臺(tái)工作總結(jié)
- IT行業(yè)安全管理工作總結(jié)
- 礦產(chǎn)資源行業(yè)會(huì)計(jì)的關(guān)鍵職責(zé)
- 醫(yī)學(xué)美容護(hù)士工作心得
- 2024年認(rèn)識(shí)小熊教案
- 2024年牧場(chǎng)之國(guó)教案
- 2024年計(jì)算機(jī)教室管理制度
- 分銷(xiāo)合同范本(2篇)
- 辦公室合同范本(2篇)
- 特種涂料類(lèi)型——耐核輻射涂料的研究
- 二氧化碳可降解塑料生產(chǎn)項(xiàng)目建議書(shū)
- 化工裝置常用英語(yǔ)詞匯對(duì)照
- 幼兒園幼兒教育數(shù)學(xué)領(lǐng)域核心經(jīng)驗(yàn)
- 病例討論麻醉科PPT課件
- EBZ220A掘進(jìn)機(jī)幻燈片
- 集體跳繩賽規(guī)則
- 煤礦調(diào)度工作培訓(xùn)內(nèi)容
- 機(jī)械原理課程設(shè)計(jì)-旋轉(zhuǎn)型灌裝機(jī)運(yùn)動(dòng)方案設(shè)計(jì)
- 標(biāo)準(zhǔn)《大跨徑混凝土橋梁的試驗(yàn)方法》
- 1、食品安全與營(yíng)養(yǎng)健康自查制度(學(xué)校食堂)
評(píng)論
0/150
提交評(píng)論