演算法複雜度分為時間複雜度和空間複雜度。其中, 時間複雜度是指執行演算法所需要的計算工作量;而空間複雜度是指執行這個演算法所需要的記憶體空間。
演算法的複雜性體現在執行該演算法時的計算機所需資源的多少上,計算機資源最重要的是時間和空間資源,因此複雜度分為時間和空間複雜度。用大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 可以在大部分的...