排序算法(正在更新中...)

目錄

 1、冒泡算法排序


 1、冒泡算法排序

具體的算法代碼:12_冒泡算法的代碼實現.py

冒泡排序的時間複雜度爲O(n^2),這種排序算法是穩定的。

優化:有可能在中間的某一步就排好序了,這時就不用再往下執行排序了。

2、選擇排序算法

 

代碼實現:07_選擇排序法代碼實現.py 

選擇排序算法的時間複雜度爲O(n^2),沒有辦法進行優化,因爲要確定元素是最小的,這種排序算法不穩定。

3、排序算法(附鏈接)


冒泡排序:
第一輪:從左到右相鄰元素比較,較大元素放在後面,第一輪下來,就會把最大的元素放在最右邊;
第二輪:從左到n-1個數,會把第二大的數移到倒數第二個位置
依次類推。
時間複雜度爲O(n^2), 空間複雜度O(1)(不需要額外的空間);
冒泡排序是一個穩定的排序方式【穩定:有重複的數字時,如出現在前面的2,排完序後,它還是在前面】;
當數組已經排好序時,可以設置停止條件,如:在一次交換搜索中,並沒有發生交換,表明該數組已排好序了,所以需要停止


選擇排序:
第一輪,會記錄下最大值的索引,最後將最後一個元素與最大值的索引位置處進行交換;
第二輪,找第二大,最後將其與倒數第二個位置交換;
依次類推。
交換次數O(n),不穩定,費適應(沒有辦法早停),時間複雜度爲O(n^2)


插入排序:
和摸牌類似,邊摸牌邊將牌放入對應的位置。
拿到第一個數,放在第一個位置;再拿到第二個數,和以一個數比較放在其前或後;再拿到第三個數,與已有的兩個數比較放在對應位置,從倒數第一個數比較如果小於倒數第一個數,二者交換位置後,再將其與倒數第二個數比較;
是穩定的,時間複雜度爲O(n^2)


希爾排序:
當數組很小時,插入排序是非常快的。插入排序的簡單擴展,用到的不是非常多。【希爾排序不會】


上面是幾種排序比較慢的方法,下面是幾種比較快的方式(計數排序,以及後面的排序方法都非常重要)
計數排序:
適用範圍:數字比較集中,即range範圍小;有很多重複的數字
首先找到最大值和最小值(也是找到了範圍),分配range(max-min+1)個位置,遍歷並計數,統計每個數出現的次數,並放在對應的位置,最後展開還原數組
時間複雜度爲O(n),缺點是需要額外的空間(當range範圍非常大時,需要的空間較大)


歸併排序(採用的是分治算法):
時間複雜度爲nlogn(遞歸,可以用主項定理進行分析),空間複雜度爲O(n),
改進:對小型子矩陣使用插入排序;測試數組是否已經按順序排序,如果第一個的最大值已經小於第二個的最小值,此時直接合並就行


快速排序【最重要的排序方式】
(也採用的是分治算法)
快速排序,遞歸:先找兩個指針指向第二個數和最後一個數,兩個指針的數分別與第一個數比較,如果cur1指的數大於第一個數,cur2指的數小於第一個數,讓兩個指針的數交換位置;如果不滿足繼續往下找,直到cur1找到大於第一個數和cur2找到小於第一個數,再交換位置【注意:cur1是從左往右找比第一個數大的數,cur2是從右往左找比第一個數小的數】,直到cur1、cur2出現交集爲止。結束一次後,再把第一個數與交集位置的數互換,此時在該數的左邊都是小於它的數,右邊都是大於它的數,再使左右兩邊都進入遞歸,從而最終實現排序(代碼實現的和這個有點不一樣,代碼是利用了python的優勢)
最優時間複雜度O(nlogn)(第一個數剛好在排序後的中間),最壞時間複雜度爲O(n^2),不需要額外的空間,所以最常使用快速排序
改進:不選擇第一個數,每次都選擇中間那個數,可以在某種程度上避免最壞時間複雜度。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章