您的位置:首頁>正文

C++實現範本實現C/C++程式設計史上新手必知九大經典排序演算法

冒泡排序

思路:

依次交換相鄰兩個數, 使大的在後, 每趟在末尾確定一個最大值

外迴圈 n 趟依次確定最大值, 次大值, ...., 確定排序

學習交流,請少俠駐足:C/C++學習交流 8群 491994603

注意:

內迴圈的相鄰元素下標寫法和內迴圈下標起始

學習交流,請少俠駐足:C/C++學習交流 8群 491994603

計數排序

思路:

找到陣列最大值 max 和最小值 min, 以差值(max-min)作為桶陣列的長度

遍歷陣列入桶計數

遍歷桶, 寫回原陣列

注意:

入桶時, 對應桶下標為

A[i]-min

寫回陣列時下標依次遞增,

A[i++] = j + min;

堆排序

思路:

初始化成大根堆

將堆頂元素(即最大值)和末尾元素交換, 並下沉該換上來的末尾元素

將堆的長度減1, 重複第二步

注意:

下標從 1 開始較方便, 子節點下標就對應為

2*i

2*i+1

初始化時從一半位置依次遞減下標使用下沉操作

下沉操作挑子節點中較大值與父節點交換, 直至 滿足父節點大於兩個子節點

插入排序

思路:

將陣列前一部作為一個“有序數組”,

該“有序數組”長度逐步擴大

每趟迴圈將當前元素依次和前一個元素比對, 插入到“有序數組”中的相應位置

注意:

注意下標起始, 外迴圈 n-1 次, 內迴圈下標遞減

插入效果可以使用兩兩相鄰交換來實現

學習交流,請少俠駐足:C/C++學習交流 8群 491994603

歸併排序

這裡使用非遞迴的 bottom-up 的實現方式

思路:

每次合併的單位長度為 size , size 依次取 1, 2, ... , 直到 size>=n

對於每個 size, 從前往後按照步長為 2*size 依次合併

歸併的內部邏輯是, 先從原陣列拷貝一份到輔助陣列, 再按序填回原陣列

注意:

需要分配一個輔助陣列用於合併

每次合併需要傳遞五個參數:原陣列, 輔助陣列以及合併的起止下標和中點下標

歸併的截止下標需要取小避免越界

Math.min(n, i + 2 * size);

內迴圈的終止條件是

i + size < n

, 步長是

2*size

學習交流,請少俠駐足:C/C++學習交流 8群 491994603

快速排序

思路:

shuffle(可選):先把原陣列隨機打亂

partition:隨機選一個數作為參考值, 比其小的放左邊, 大的放右邊

遞迴地排序上述結果的左半部分和右半部分

注意:

一般參考值就取第一個元素, 對後面的元素進行劃分

劃分時注意迴圈終止條件, 大於小於帶不帶等號, 都要注意

學習交流,請少俠駐足:C/C++學習交流 8群 491994603

選擇排序

思路:

每次遍歷一趟挑取最小元素, 將該元素與起始元素交換

起始元素下標依次為0, 1, ..., n-1

注意:

比較的是值, 記錄的是下標

學習交流,請少俠駐足:C/C++學習交流 8群 491994603

基數排序

以元素小於等於 2000 為例,位數為 4

思路:

準備一個 10*n 的桶陣列(10 代表 0~9 的數位,n代表某個數位下最多容納的個數,這裡為原陣列大小 n)

由低位元到高位,將3,4步執行位數次迴圈

遍歷陣列,按照某一位元的數位將元素入桶

從大數位到小數位,依次將桶內元素從後往前寫回原陣列

注意:

需要兩個輔助陣列,一個用於存放元素,一個用於記錄每個數位桶的元素個數

入桶時一定要先低位元,再高位,這樣才能保證最高位影響最大

取桶內元素返到陣列時一定要倒著取,這樣才能保證之前排序的順序

希爾排序

思路:

對陣列進行步長為1,4,13,...,(3*前一個步長+1)的插入排序,步長由大到小

注意:

最外層先計算好最大步長,每次除以三

插入排序的外層起始下標為 h,每次下標遞增 1

插入排序的內層遞減步長為 h

選擇關鍵字進行排序,學習交流,請少俠駐足:C/C++學習交流 8群 491994603

關鍵字 ----元素個數有關係

[6 2 4 1 5 9]

//通用分組 每次選取一半,直到 關鍵字 為1

關鍵字:6/2=3 每隔3個元素分為一組

分組怎麼分

[6,1] : 1,6

[2,5] : 2,5 //不動

[4,9] : 4,9 //不動

關鍵字:3/2=1

[6 2 4 1 5 9]

//關鍵字為3排序後的結果

[1 2 4 6 5 9]

進行插入排序: 選出5 找到合適的位置進行插入

[1 2 4 5 6 9]

學習交流,請少俠駐足:C/C++學習交流 8群 491994603

學習交流,請少俠駐足:C/C++學習交流 8群 491994603

基數排序

以元素小於等於 2000 為例,位數為 4

思路:

準備一個 10*n 的桶陣列(10 代表 0~9 的數位,n代表某個數位下最多容納的個數,這裡為原陣列大小 n)

由低位元到高位,將3,4步執行位數次迴圈

遍歷陣列,按照某一位元的數位將元素入桶

從大數位到小數位,依次將桶內元素從後往前寫回原陣列

注意:

需要兩個輔助陣列,一個用於存放元素,一個用於記錄每個數位桶的元素個數

入桶時一定要先低位元,再高位,這樣才能保證最高位影響最大

取桶內元素返到陣列時一定要倒著取,這樣才能保證之前排序的順序

希爾排序

思路:

對陣列進行步長為1,4,13,...,(3*前一個步長+1)的插入排序,步長由大到小

注意:

最外層先計算好最大步長,每次除以三

插入排序的外層起始下標為 h,每次下標遞增 1

插入排序的內層遞減步長為 h

選擇關鍵字進行排序,學習交流,請少俠駐足:C/C++學習交流 8群 491994603

關鍵字 ----元素個數有關係

[6 2 4 1 5 9]

//通用分組 每次選取一半,直到 關鍵字 為1

關鍵字:6/2=3 每隔3個元素分為一組

分組怎麼分

[6,1] : 1,6

[2,5] : 2,5 //不動

[4,9] : 4,9 //不動

關鍵字:3/2=1

[6 2 4 1 5 9]

//關鍵字為3排序後的結果

[1 2 4 6 5 9]

進行插入排序: 選出5 找到合適的位置進行插入

[1 2 4 5 6 9]

學習交流,請少俠駐足:C/C++學習交流 8群 491994603

同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示