話不多說:對於排序演算法,可以大致的分為兩類 :
比較類排序:通過比較決定元素之間的相對次序,由於其時間複雜度不能突破o(nlogn),因此也稱為非線性時間比較類排序。非比較類排序,相反道理,不通過比較來決定元素之間的相對次序,它可以突破基於比較排序的時間下界,以線性時間來執行,因此也稱為線性時間非比較類排序
仿照網路大神做了一張思維導圖:
對於演算法複雜度:
在先了解其複雜度及穩定性之前,我們先了解一下什麼是複雜度和穩定性:
時間複雜度和空間複雜度:
定義:乙個演算法中的語句執行次數稱為語句頻度或者時間頻度;
一般來:檢驗演算法的效率,主要考慮最壞時間複雜度和平均時間複雜度。如果沒有嚴格說明,那就是以最壞時間複雜度為標準計量。
時間複雜度:
概念乙個演算法執行所耗費的時間,從理論上講是無法計算,明確的。但是單從具體演算法執行花費時間來判斷演算法是不可選。那麼我們可以知道乙個演算法執行所花費的時間和演算法中語句的執行次數是成正比的,那麼我們從理論上就可以知道演算法執行的次數多,那麼它的花費時間就多。在時間頻度中,n是稱為問題的規模,當n不斷發生變化時,時間頻度t(n)也會不斷變化。但是它的變化是有規律的,所以就可以用時間複雜度這個理論上的概念來描述。一般來說,演算法中的基本操作重複次數的是問題規模n的某個函式,用t(n)表示,若有某個輔助函式f(n),使得n在趨近無窮大時,t(n)/f(n)的極限值為不等於零的常數,則稱f(n)是t(n)的同數量級函式。記作t(n) = o(f(n)),那麼稱o(f(n))為演算法的漸進時間複雜度,那麼就是我們俗稱的時間複雜度。
計量方式如果演算法的執行時間不會隨著問題的規模n的增長而增長,那麼即使演算法中存在有上千萬條**語句,但是它是執行時間也就是乙個常數。此類演算法時間複雜度均為o(1);按照數量級遞增的。常見的時間複雜度有:常數階o(1),對數階o(㏒₂n),線性階o(n),線性對數階o(n㏒₂n),平方階o(n²),立方階o(n³)………等,k次方階o(nk),指數階o(2ⁿ)。當然隨著問題規模n的不斷增加,那麼以上的時間複雜度也會隨之不斷增加的,那麼演算法的執行效率也會隨之下降。最簡單的計量方式:乙個迴圈為n,乙個巢狀為n的+1次方,並列時是+n,最後結果取最大值。
空間複雜度
乙個程式的空間複雜度是指執行完乙個程式所需記憶體的大小固定部分。這部分空間的空間大小與輸入/輸出的資料的個數多少、數值無關。主要包括指令空間(**空間)、資料空間·(常量、簡單變數)等所佔的空間。這部分屬於靜態空間。可變空間,這部分空間的主要包括動態分配的空間,已經遞迴棧所需的空間等。這部分空間的大小與演算法有關。
乙個演算法所需的儲存空間用f(n)表示。s(n) = o(f(n)),那麼其中的n為問題的規模,s(n)表示空間複雜度。
穩定性
只如果a排序前處於b前面,a==b,排序完後a任然處於b前面,此為穩定,反之不穩定。
排序直通車:
1.氣泡排序:
2.選擇排序:
3.插入排序:
4.希爾排序:
5.歸併排序:
6.快速排序:
7.堆排序:
8.計數排序:
9.桶排序:
10.基數排序:
十大排序演算法(Java實現)
氣泡排序 public static int bubblesort int arr return arr 選擇排序 public static int selectsort int arr swap arr,i,min return arr 插入排序 public static int insert...
十大排序演算法
1.非線性時間類排序 時間複雜度未突破 0 nlog 2n 不穩定的四個排序演算法 選擇排序 0 n2 希爾排序 0 n1.3 希爾排序實現python 快速排序 0 n log2 n 0 nlog 2n 0 nlog 2 n 快速排序實現c python 堆排序 0 n log2 n 0 nlog...
十大排序演算法
排序規則 從左至右依次增大 一 基於比較的排序演算法 插入排序 逐個遍歷未排序序列,將其在已排序序列中從右到左比較,直到遇到比自己小的數,然後將元素插入到那個數的後面,有序序列從左向右生長。選擇排序 在未排序序列中選擇最小的元素,將其插入到已排序序列的末尾,有序序列從左向右生長。氣泡排序 從左至右逐...