演算法設計和資料結構學習 2 常見排序演算法思想

2022-03-23 00:46:13 字數 1979 閱讀 9736

一般約定我們是按照從小到大的順序排序。

按照向量的形式來參考排序中陣列元素的相對位置,行向量中最左邊為陣列的第乙個元素,且稱為前面。列向量中最上面的元素為陣列的第乙個元素,也是稱為前邊。

對常見的排序演算法的思想要有個認識,比如說:氣泡排序,選擇排序,插入排序,快速排序,shell排序,堆排序,歸併排序,基排序。

演算法的穩定性是看原先資料中相同的元素值的順序在排序後是否改變了?如果依舊保持不變,則說明該演算法是穩定的。比如說,選擇排序、快速排序、希爾排序、堆排序不是穩定的排序演算法,而氣泡排序、插入排序、歸併排序和基數排序是穩定的排序演算法。

選擇排序是每次找到資料中最大的或者最小的數,然後和第乙個數交換,每次迴圈比較多次,但是只交換一次。而交換排序是選定乙個元素後,陣列中該元素後面的元素依次與選定的元素進行比較,如果後面的元素比該元素小,則交換,直到掃瞄到陣列尾部,所以交換排序每一趟掃瞄可能會交換多次。選擇排序和交換排序都是非穩定的排序方法。

一般來說,插入排序都採用in-place在陣列上實現。具體演算法描述如下:

從第乙個元素開始,該元素可以認為已經被排序

取出下乙個元素,在已經排序的元素序列中從後向前掃瞄

如果該元素(已排序)大於新元素,將該元素移到下一位置

重複步驟3,直到找到已排序的元素小於或者等於新元素的位置

將新元素插入到該位置後

重複步驟2~5。

如果比較操作的代價比交換操作大的話,可以採用二分查詢法來減少比較操作的數目。該演算法可以認為是插入排序的乙個變種,稱為二分查詢排序。(插入排序參考的是維基百科插入排序- 維基百科)

快速排序的思想是在資料中選出乙個資料x,以該資料為基點,將小於它的資料放左邊,大於它的資料放右邊(方法是:首先選取乙個pivot,將其放在陣列的最後。然後從資料的最後乙個元素(此時不包括pivot那個數)向前一直到x,找出第乙個比x小的元素,同時從資料序列中第乙個位置開始到新的x位置找出第乙個比x大的元素,交換這兩者(乙個大於pivot的數和乙個小於pivot的數)的位置,依次交替進行,直到所有的數字已經比較過),當將資料分好為2部分後,分別在各自的部分採用相同的方法進行排列,最終直到分出的組元素個數為0或者為1時結束排序。參考常見排序演算法的實現(五)-快速排序。

shell排序是將原始資料按照一定的增量分為幾個小組,然後在每個小組內部使用插入排序方法,待每個小組內都排序完後重新按照前面的位置組合這些資料,接著採用更大的增量值將資料分為更少的組,同樣的在組內用插入排序方法進行排序,依次類推,直到最後增量最大即只分為乙個組時,排序完後就結束。可以參考維基百科中希爾排序的例子,一目了然。

如果要對資料按照從小到大的堆排序,則應該將這些資料初始化為大堆,反之亦然。堆排序是按照將資料先排列成堆(此時採用的方法是每次從最後乙個非葉子節點開始,將以該節點為根節點的調樹整成對應的堆形式,然後依次遞減找到倒數第2,第3,…等一直到根節點),然後每次將排列好的堆的第乙個資料與最後乙個葉子節點交換,交換完後重新對原先的堆(少了乙個節點)調整為大堆。具體可以參考前面的博文:演算法設計和資料結構學習_1(一道堆排序作業題)。

歸併排序和快速排序一樣,也是採用的「分治」思想。方法是:先將資料分成n組(一般每組為2個元素),每組內從小到大排序,然後申請乙個2個組大小的空間,並分別設定指標指向那2個組的初始元素,比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間,並移動指標到下一位置,重複這一步驟直到某一指標達到序列尾。將另一串行剩下的所有元素直接複製到合併序列尾。繼續用同樣的方法進行歸併。可以參考維基百科的歸併排序。

基數排序是將資料集中一次每個資料的個位,十位,千位等放入標有序列號的桶中,最後將桶中的資料重新組合成最終的排序序列,該演算法是穩定的。可以參考基數排序裡面的例子。

12.  常見的排序演算法複雜度比較:

常見排序演算法的實現(五)-快速排序

演算法設計和資料結構學習_1(一道堆排序作業題)

插入排序- 維基百科

希爾排序

歸併排序

基數排序

各種排序演算法的穩定性和時間複雜度小結

演算法和資料結構學習筆記

演算法和資料結構就是程式設計的乙個重要部分,你若失掉了演算法和資料結構,你就把一切都失掉了。一 資料結構和演算法緒論 說說資料結構 程式設計 資料結構 演算法 再簡單來說,資料結構就是關係,也就是資料元素相互之間存在的一種或多種特定關係的集合。資料結構的分類 傳統上,我們把資料結構分為邏輯結構和物理...

資料結構學習總結 2 演算法

演算法 演算法是解決特定問題求解步驟的描述,在計算機中表現為指令的有限序列,並且每條指令表示乙個或多個操作。現在要求寫乙個1 2 3 100結果的程式。普通迴圈相加法 sum 0 n 100 for i 1 i n i print r sum 高斯求和法 sum 0 n 100 sum 1 n n ...

Python和資料結構學習 3

下面是使用array實現vector.也就是python中自帶的list 如下 2 v v self.capacity 2 i,v self.length 1 self.length i range self.length,ndx,1 self i 1 1 i self i 1 1 i,v v 1 ...