列表逆序排序 常用七種排序的Python實現

2021-10-16 06:57:00 字數 2899 閱讀 8923

演算法複雜度分為時間複雜度和空間複雜度。其中, 時間複雜度是指執行演算法所需要的計算工作量;而空間複雜度是指執行這個演算法所需要的記憶體空間。

演算法的複雜性體現在執行該演算法時的計算機所需資源的多少上,計算機資源最重要的是時間和空間資源,因此複雜度分為時間和空間複雜度。用大o表示。

常見的時間複雜度(按效率排序)

冒泡法:第一趟:相鄰的兩數相比,大的往下沉。最後乙個元素是最大的。

第二趟:相鄰的兩數相比,大的往下沉。最後乙個元素不用比。

時間複雜度:o(n^2)

穩定性:穩定

改進:如果一趟比較沒有發生位置變換,則認為排序完成

選擇排序法:每一次從待排序的資料元素中選出最小(或最大)的乙個元素,存放到序列的起始位置,直到全部排完。

時間複雜度:o(n^2)

穩定性:不穩定

列表被分為有序區和無序區兩個部分。最初有序區只有乙個元素。

每次從無序區選擇乙個元素,插入到有序區的位置,直到無序區變空。

其實就相當於摸牌:

時間複雜度:o(n^2)

穩定性:穩定

取乙個元素p(通常是第乙個元素,但是這是比較糟糕的選擇),使元素p歸位(把p右邊比p小的元素都放在它左邊,在把空缺位置的左邊比p大的元素放在p右邊);

列表被p分成兩部分,左邊都比p小,右邊都比p大;

遞迴完成排序。

時間複雜度:o(nlogn),一般情況是o(nlogn),最壞情況(逆序):o(n^2)

穩定性:不穩定

特點:就是快

步驟:建立堆

得到堆頂元素,為最大元素

去掉堆頂,將堆最後乙個元素放到堆頂,此時可通過一次調整重新使堆有序。

堆頂元素為第二大元素。

重複步驟3,直到堆變空。

時間複雜度:o(nlogn),

穩定性:不穩定

特點:通常都比快排慢

回顧一下堆排的過程:

1. 建立最大堆(堆頂的元素大於其兩個兒子,兩個兒子又分別大於它們各自下屬的兩個兒子... 以此類推)

2. 將堆頂的元素和最後乙個元素對調(相當於將堆頂元素(最大值)拿走,然後將堆底的那個元素補上它的空缺),然後讓那最後乙個元素從頂上往下滑到恰當的位置(重新使堆最大化)。

3. 重複第2步。

這裡的關鍵問題就在於第2步,堆底的元素肯定很小,將它拿到堆頂和原本屬於最大元素的兩個子節點比較,它比它們大的可能性是微乎其微的。實際上它肯定小於其中的乙個兒子。而大於另乙個兒子的可能性非常小。於是,這一次比較的結果就是概率不均等的,根據前面的分析,概率不均等的比較是不明智的,因為它並不能保證在糟糕情況下也能將問題的可能性削減到原本的1/2。可以想像一種極端情況,如果a肯定小於b,那麼比較a和b就會什麼資訊也得不到——原本剩下多少可能性還是剩下多少可能性。

在堆排裡面有大量這種近乎無效的比較,因為被拿到堆頂的那個元素幾乎肯定是很小的,而靠近堆頂的元素又幾乎肯定是很大的,將乙個很小的數和乙個很大的數比較,結果幾乎肯定是「小於」的,這就意味著問題的可能性只被排除掉了很小一部分。

這就是為什麼堆排比較慢(堆排雖然和快排一樣複雜度都是o(nlogn)但堆排複雜度的常係數更大)。

mackay也提供了乙個修改版的堆排:每次不是將堆底的元素拿到上面去,而是直接比較堆頂(最大)元素的兩個兒子,即選出次大的元素。由於這兩個兒子之間的大小關係是很不確定的,兩者都很大,說不好哪個更大哪個更小,所以這次比較的兩個結果就是概率均等的了

思路:一次歸併:將現有的列表分為左右兩段,將兩段裡的元素逐一比較,小的就放入新的列表中。比較結束後,新的列表就是排好序的。

然後遞迴。

時間複雜度:o(nlogn)

穩定性:穩定

快排、堆排和歸併的小結

三種排序演算法的時間複雜度都是o(nlogn)

一般情況下,就執行時間而言:

快速排序 < 歸併排序 < 堆排序

三種排序演算法的缺點:

快速排序:極端情況下排序效率低

歸併排序:需要額外的記憶體開銷

堆排序:在快的排序演算法中相對較慢

希爾排序是一種分組插入排序演算法。

首先取乙個整數d1=n/2,將元素分為d1個組,每組相鄰量元素之間距離為d1,在各組內進行直接插入排序;

取第二個整數d2=d1/2,重複上述分組排序過程,直到di=1,即所有元素在同一組內進行直接插入排序。希爾排序每趟並不使某些元素有序,而是使整體資料越來越接近有序;最後一趟排序使得所有資料有序。

時間複雜度:o((1+τ)n)

不是很快,位置尷尬

七種常用排序演算法總結

1.氣泡排序 bubble sort package com.zha.wmls.sort 氣泡排序 每一輪找出乙個最大的,放在最後面,穩定 時間複雜度為n 2 public class bubblesort long befortime system.currenttimemillis sort a...

七種排序方法

一 快速排序 1.簡單介紹 快速排序是由東尼 霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個專案要 n log n 次比較。在最壞狀況下則需要 n2 次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他 n log n 演算法更快,因為它的內部迴圈 inner loop 可以在大部分的...

七種排序方法

一 快速排序 1.簡單介紹 快速排序是由東尼 霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個專案要 n log n 次比較。在最壞狀況下則需要 n2 次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他 n log n 演算法更快,因為它的內部迴圈 inner loop 可以在大部分的...