六種排序演算法 主要思想以及實現

2021-10-20 06:36:26 字數 2153 閱讀 4840

氣泡排序比較簡單,相信知道思想自己就能寫出**。

思路:根據陣列長度決定遍歷的次數,每次遍歷就找出這次遍歷的最大值或者最小值,那麼就排好序了。這時候寫出的**是可以優化的,我們從思想中可以看出來,只要某一次遍歷,陣列元素根本沒有進行交換,那麼就已經排好序了,直接退出就好。

其實選擇排序也是比較簡單的,所謂選擇就是滿足我要求的就放置在合適的位置上。比如說我公升序排列,在每一次遍歷的時候,不進行位置的交換,我只對最小值所在位置的記錄,等到遍歷完這一次,那麼這就是我想要的最小值。當然遍歷次數也是陣列的長度減一

插入排序思想挺奇妙的,乙個陣列看為有序表和無序表通過移位來將有序表填充。這裡用的是移位而不是以前常用的交換,當然交換也能做,只是需要的操作需要多一點。

對於希爾排序其實就是插入排序的優化,因為如果存在前面100個數都是有序的最後乙個數是最小的,那麼利用插入排序就需要做很多無意義的迴圈,為了減少這些迴圈,希爾排序就被提出了。

主要思想還是簡單的,首先將陣列分為其長度一半個分組(加入分為了五組那麼0,5,10…就是一組的),然後遍歷這些分組對這些分組中的元素進行移位操作。這樣做即使為了讓小的數聚集在一邊,大的數聚集在一邊。然後較小分組,每次都將分組減小一倍,這樣。直到最後乙個分組,在進行插入排序就完成了排序

主要思想:初始化乙個基準數以及兩個指標,乙個指向陣列尾部,乙個指向陣列頭部。然後對這個這個陣列進行遍歷,如果在右邊指標發現比基準數小的值退出迴圈,開始啟動左邊的指標迴圈遍歷看是否出現有比基準數大的值,如果有就退出迴圈進行交換。總會出現一次兩個指標相遇,相遇就退出迴圈,讓base的值與這個兩個指標相遇位置換位。然後以當前位置劃分為兩塊區域,進行上述相似操作。

先解釋為什麼能排好序,你看其實每次選出來的數就是其該有的位置,不管其左邊的數有沒有排好序,都知道左邊的數是小於這個值的,所以其位置就是該在這裡。

這個快速排序還是挺好玩的,想法很奇妙!

總所周知歸併演算法是分而治之的思想,其實就是將每一階段得到的結果進行組合,得到的就是正確的結果集。

主要思想:借助額外空間,首先對分組陣列進行遍歷,因為處理的是分割陣列的左右兩邊的指標對應值,所以遍歷陣列的兩個指標的對應值,通過比較值的大小進行,加入到額外陣列,加完後,將遍歷這個額外陣列將對應下標和對應值進行修改。這樣就完成這個分組的排序。當變為兩個分組時,這時左邊是公升序,右邊也是公升序,按照上述操作進行排序到額外陣列以及對原有陣列進行改變,就變成了乙個有序陣列。

首先將該陣列進行分組,利用左指標和右指標算中間值,然後根據中間值進行分割,直到左指標和右指標相等返回。返回後,就開始進行以該分組開始排序。

分組:

排列陣列

關於堆排序,首先還是要知道堆這個結構其實就是類似於完全二叉樹的一種資料結構,只不過所儲存的資料不再僅限於從小到大,除了值的規定不一樣外堆還是遵循完全二叉樹的特點的。

大頂堆:即父節點是大於子節點。

小頂堆:父節點小於子節點。

首先要知道幾個特性其實就是完全二叉樹的特性,這裡使用陣列來表示n = arr.length/2 -1。左子節點下標lfson=(n<<1)+1,右子節點rtson=(n<<1)+2。n為父節點的在陣列的下標。

原理:根據堆這一資料結構選出每次最大值,與參與本次排序的最後乙個節點交換位置,交換後堆會進行重構,當又成為乙個堆後再次把第乙個元素拿出來與最後乙個元素交換,直到只剩下最後乙個值。

演算法的六種排序

一 選擇排序法 簡單選擇排序是最簡單直觀的一種演算法,基本思想為每一趟從待排序的資料元素中選擇最小 或最大 的乙個元素作為首元素,直到所有元素排完為止,簡單選擇排序是不穩定排序。for int i 0 i arr.length 1 i 簡單選擇排序通過上面優化之後,無論陣列原始排列如何,比較次數是不...

六種排序的C 實現

class sortnum 具體實現 view plain copy to clipboard print?include sortnum.h include iostream.h construction destruction sortnum sortnum sortnum sortnum 交換...

實現負載均衡的六種演算法

1 輪詢法 將請求按順序輪流地分配到後端伺服器上,它均衡地對待後端的每一台伺服器,而不關心伺服器實際的連線數和當前的系統負載。2 隨機法 通過系統的隨機演算法,根據後端伺服器的列表大小值來隨機選取其中的一台伺服器進行訪問。由概率統計理論可以得知,隨著客戶端呼叫服務端的次數增多,其實際效果越來越接近於...