




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、學習-好資料更多精品文檔各種排序算法總結排序算法是最基本最常用的算法,不同的排序算法在不同的場景或應用中會有不 同的表現,我們需要對各種排序算法熟練才能將它們應用到實際當中,才能更好地發揮它們的優勢。今天,來總結下各種排序算法。下面這個表格總結了各種排序算法的復雜度與穩定性:Si冊序O(n2)O(T?)O(n)0(O0(n2)0(n20(1)0()O(loffn)丁誦走0并滬O(nlntjn)O(l|O(nlcffn)OfnfiDTi)0(1)卜綻昨;網E呼O(mj) 10(1)下號O(lngaB)0(噸朋)二受枉1扌豐帶O(n/ogn)?(T1】謝走O(rt + k 11O(n + kO(n
2、 - k)各種排序算法復雜度比較.png冒泡排序冒泡排序可謂是最經典的排序算法了,它是基于比較的排序算法,時間復雜度為0(nA2),其優點是實現簡單,n較小時性能較好。*算法原理相鄰的數據進行兩兩比較,小數放在前面,大數放在后面,這樣一趟下來, 最小的數就被排在了第一位,第二趟也是如此,如此類推,直到所有的數 據排序完成C+代碼實現1.voidbubble_sort(intarr,intlen)2.3.for ( inti =0;:i =i; j-)6.7.if (arrj arrj -1)8.9.inttemp =arrj;10.arrj = arrj11.arrj -5
3、. 1;1 = temp;選擇排序*算法原理先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然 后,再從剩余未排序元素中繼續尋找最小(大)元素,然后放到已排序序 列的末尾。以此類推,直到所有元素均排序完畢。C+代碼實現1.voidselect_sort(int arr,int len)2.3.for ( inti =0; i len; i+)4.5.intin dex = i;6.for(int j = i +1; j len; j+)7.8.if (arrj arri ndex)9.in dex =j;10.11.if(in dex != i)12.13.int temp =
4、arri;14.arri = arri ndex;15.arrin dex = temp;16.17.18.插入排序算法原理將數據分為兩部分,有序部分與無序部分,一開始有序部分包含第1個元 素,依次將無序的元素插入到有序部分, 直到所有元素有序。插入排序又 分為直接插入排序、二分插入排序、鏈表插入等,這里只討論直接插入排 序。它是穩定的排序算法,時間復雜度為 0(n A2)C+代碼實現void insert_sort(int arr, int len) 一3.for(int i =1; i -1 & k arrj)8.9.arrj+1 = arrj10.j -J11.12.arrj+ 1=k;
5、13.14.快速排序*算法原理快速排序是目前在實踐中非常高效的一種排序算法, 它不是穩定的排序算 法,平均時間復雜度為0(nlogn),最差情況下復雜度為0(nA2)。它的基 本思想是:通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部 分的所有數據都比另外一部分的所有數據都要小, 然后再按此方法對這兩 部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個 數據變成有序序列。C+代碼實現1.voidquick_sort(int arr,int left,2.3.if(left right)4.5.int i = left, j = right, target =arrleft;
6、6.while (i j)7.8.while (i target)9.j-;10.if (i j)11.arri+ = arrj;12.13.while (i j & arri target)14.i+;15.if (i j)16.arrj = arri;17.18.arri = target;19.quick_sort(arr, left, i -1);20.quick_sort(arr, i +1, right);21.intright)22. 歸并排序*算法原理歸并排序具體工作原理如下(假設序列共有n個元素):o將序列每相鄰兩個數字進行歸并操作(merge),形成floor(n/2) 個
7、序列,排序后每個序列包含兩個元素0將上述序列再次歸并,形成floor( n/4)個序列,每個序列包含四個元素o重復步驟2,直到所有元素排序完畢歸并排序是穩定的排序算法,其時間復雜度為 0(nlogn),如果是 使用鏈表的實現的話,空間復雜度可以達到 0(1),但如果是使用 數組來存儲數據的話,在歸并的過程中,需要臨時空間來存儲歸并 好的數據,所以空間復雜度為0(n)C+代碼實現1.void merge( int arr,int temp_arr,int startndex,int mid_i ndex,int end_in dex)2.3.int i = start_i ndex, j = m
8、id_i ndex +1;4.int k =0;5.while (i midndex +1 & j arrj)8.temp_arrk+ = arrj+;9.else10.temp_arrk+ = arri+;11. _12.while (i mid_i ndex +1)13. _14.temp_arrk+ = arri+;15.16.while (j end_in dex +1)17.temp_arrk+ = arrj+;18.19.for (i =0, j = start_i ndex; j end_in dex +1;i+,j +)20.arrj = temp arri;21. _22.2
9、3.void merge_sort(int arr,int temp_arr,intstart_in dex,int end_in dex)if (startndex end_in dex)int mid_i ndex = (startndex + end_in dex)/ 2;merge_sort(arr, temp_arr, startndex, mid_in dex); TOC o 1-5 h z merge_sort(arr, temp_arr, mid_i ndex +1, end_in dex);merge(arr, temp_arr, startndex, midndex, en
10、d_in dex);堆排序二叉堆二叉堆是完全二叉樹或者近似完全二叉樹,滿足兩個特性*父結點的鍵值總是大于或等于(小于或等于)任何一個子節點的鍵值每個結點的左子樹和右子樹都是一個二叉堆當父結點的鍵值總是大于或等于任何一個子節點的鍵值時為最大堆。當父結點的鍵值總是小于或等于任何一個子節點的鍵值時為最小堆。一般二叉樹簡稱為堆。堆的存儲一般都是數組來存儲堆,點下標分別為2* i + 1 和2。存儲結構如圖所示:邏短結構13254231i結點的父結點下標就為(i - 1) / 2 。它的左右子結 和2 * i + 2 。如第0個結點左右子結點下標分別為1堆結構.png堆排序原理 堆排序的時間復雜度為0(
11、 nlogn)算法原理(以最大堆為例)o先將初始數據R1.n建成一個最大堆,此堆為初始的無序區o再將關鍵字最大的記錄R1(即堆頂)和無序區的最后一個記錄 Rn交換,由此得到新的無序區R1.n-1和有序區Rn,且滿足R1.n-1.keys Rn.keyo由于交換后新的根R1可能違反堆性質,故應將當前無序區 R1. n-1調整為堆。o重復2、3步驟,直到無序區只有一個元素為止。C+代碼實現1./*2.* 將數組arr構建大根堆3.* param arr待調整的數組4.* param i待調整的數組元素的下標5.* param len數組的長度6.*/7.void heap_adjust(int a
12、rr,int i,int len)8.9.int child;10.int temp;11.12.for (;2 * i +1 le n; i=child)13.14.child =2 * i +1;/子結點的位置結點的位置+ 115./得到子結點中鍵值較大的結點16.if(child arr=2 *學習 好資料更多精品文檔1./ 如果較大的子結點大于父結點那么把較大的子結點往上移動,替換它的父結點if (arri =0; i-)heap_adjust(arr, i, len);for (i = len - 1; i 0; i-)/ 將第 1 個元素與當前最后一個元素交換,保證當前的最后一個位置的元素都是現在的這個序列中最大的 int temp = arr 0;52.arr0 =
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 勞務分包合同實例
- 專業體育用品零售連鎖店采購合同
- 《醫療質量管理體系》課件
- 五方股權轉讓合同
- 日文離婚協議書
- 轉租廣告位合同協議
- 死亡享保協議書
- 車輛座套廣告合同協議
- 超市租賃裝修合同協議
- 旱廁承包協議書
- 元朝蒙古帝國的統治
- 全屋硬裝 工具-版本信息 v2-2021041課件講解
- 少先隊隊員知識考核試題參考(有答案)
- 《論教育》主要篇目課件
- 山東師范大學形勢與政策期末復習題
- 消防查驗合同范例
- 園丁與木匠讀書分享
- 軟件資格考試信息安全工程師(基礎知識、應用技術)合卷(中級)試卷與參考答案(2025年)
- 2024年5月26日河南省事業單位聯考《職業能力測試》試題
- 模擬法庭的劇本
- 保險行業保險理賠風險管理方案
評論
0/150
提交評論