一、複雜度的概念
1、時間頻度
乙個演算法執行所耗費的時間,理論上是無法算出來的。因為這和執行環境的硬體有關。每一台機器上進行測試並不現實,實際上我們只需要知道哪些演算法執行快,哪些演算法執行慢就夠了。並且,乙個演算法花費的時間與演算法中語句執行的次數成正比。乙個演算法中語句的執行次數稱為語句品讀或者 事件頻度,記為t(n)(其中n是問題的規模)。
2、時間複雜度
上面提到的時間頻度t(n)是n的函式,我們想知道t(n)隨著n的變化呈現出什麼樣的變化規律,為此引入了時間複雜度的概念。
一般情況下,演算法中基本操作重複執行的次數是問題規模n的函式,記為t(n),若存在某輔助函式f(n),當n趨於無窮大時,t(n)/f(n)的極限值為不等於0的常數,則稱f(n)為t(n)的同量級函式,記為t(n) = o(f(n)),我們將o(f(n))叫做演算法的漸進時間複雜度,簡稱時間複雜度。
1) 若演算法中語句執行次數為乙個常數,則時間複雜度為o(1)。
2)時間頻度不同的時候,時間複雜度可能相同。如t(n) = n^2+3*n+4與t(n) = 4*n^2+2*n+1的時間複雜度相同都是o(n^2)。
3)時間複雜度越大,演算法的執行效率越低。我們主要用演算法時間複雜度的數量級(即演算法的漸進時間複雜度)評價乙個演算法的時間效能。
二、幾種常見的排序演算法及其複雜度
1、氣泡排序(bubble sort)
依次比較相鄰的兩個數,將小數放在前面,大數放在後面。這樣小數像氣泡一樣不斷上公升,大數下沉。
比較流程:
a. 第一趟:首先比較第1個和第2個數,將小數放前,大數放後。然後比較第2個數和第3個數,將小數放前,大數放後。直至比較最後兩個數將小數放前,大數放後。這樣,最大的數放到了最後。
b.第二趟:對前n-1個數執行a步驟中的比較
c.直到整個序列有序。
**示例:
void bubblesortmethod(int arr)
}if (!bdidswap)
}}
我們來看一下每個語句的執行次數:
最好的情況下,假設序列是正序的:
語句const
times
i=0c1
1ic2
1i++c30
bdidswap = falsec41
j=0c5
1jc6
n-1j++
c7n-2
arr[j]>arr[j+1]
c8n-1
swap(arr[j],arr[j+1])c90
bdidswap = true
c100
break
c111
t(n) = c1[1] + c2[1] + c3[0] + c4[1] + c5[1] + c6[n-1] + c7[n-2] + c8[n-1] + c9[0] + c10[0] + c11[1] = 3*n+1,故最好的情況下時間複雜度為o(n)。
最壞的情況下,假設序列是逆序排列的:
語句const
times
i=0c1
1ic2
ni++
c3n-1
bdidswap = falsec4n
j=0c5
njc6
n(n-1)/2
j++c7
(n-1)(n-2)/2
arr[j]>arr[j+1]
c8(n-1)(n-2)/2
swap(arr[j],arr[j+1])
c9(n-1)(n-2)/2
bdidswap = true
c10(n-1)(n-2)/2
break
c110
t(n) = c1[1] + c2[n] + c3[n-1] + c4[n] + c5[n] + c6[n(n-2)/2] + c7[(n-1)(n-2)/2] + c8[(n-1)(n-2)/2] + c9[(n-1)(n-2)/2] + c10[(n-1)(n-2)/2] + c11[0] = 5/2*n^2 -3*n +4,故最壞的情況下時間複雜度為o(n^2)。
一般情況,假設第k趟(k語句
const
times
i=0c1
1ic2
ki++
c3k-1
bdidswap = falsec4k
j=0c5
kjc6
(2n-k-1)k/2
j++c7
(2n-k+1)k/2
arr[j]>arr[j+1]
c8(2n-k-1)k/2
swap(arr[j],arr[j+1])
c9(2n-k-1)k/2
bdidswap = true
c10(2n-k-1)k/2
break
c111
t(n) = c1[1] + c2[k] + c3[k-1] + c4[k] + c5[k] + c6[(2n-k-1)k/2] + c7[(2n-k+1)k/2] + c8[(2n-k-1)k/2] + c9[(2n-k-1)k/2] + c10[(2n-k-1)k/2] + c11[1] = 5k*n-5/2*k^2 + 5/2*k +1,
假設k為1~n-1之間任何乙個值的概率是n/1,則平均時間複雜度為(t(n)[k=1]+t(n)[k=2]+……+t(n)[k = n-1])/n =5/3*n^2 + 5/6 -5/2 *1/n, 故平均情況下時間複雜度為o(n^2)。
2、氣泡排序——好搜百科
3、常用排序演算法及時間複雜度——csdn部落格
4、經典排序演算法集錦——
5、氣泡排序最佳情況下的複雜度為什麼是o(n)——
常見幾種排序以及其時間複雜度
1.選擇排序 不穩定,時間複雜度 o n 2 選擇排序的基本思想是對待排序的記錄序列進行n 1遍的處理,第i遍處理是將l i.n 中最小者與l i 交換位置。這樣,經過i遍處理之後,前i個記錄的位置已經是正確的了。2.插入排序 穩定,時間複雜度 o n 2 插入排序的基本思想是,經過i 1遍處理後,...
常見排序演算法複雜度
相關概念 1 穩定排序 stable sort 和非穩定排序 穩定排序是指所有相等的數經過某種排序演算法操作後仍然能保持它們在排序之前的相對次序。反之就是非穩定排序。2 內排序 internal sorting 和外排序 external sorting 在排序過程中,所有需要排序的數都在記憶體,並...
幾種常用排序演算法的複雜度
幾種常用排序演算法的複雜度 quicksort 快速排序 mergesort 歸併排序 timsort 是乙個歸併排序做了大量優化的版本。對歸併排序排在已經反向排好序的輸入時表現o n 2 的特點做了特別優化。對已經正向排好序的輸入減少回溯。對兩種情況混合 一會公升序,一會降序 的輸入處理比較好。h...