我理解的是,快速排序用的是分治法,運用的遞迴的演算法,先挑選乙個基準值,小於基準值的數放在左邊,
大於基準值的數放在基準值的右邊,這樣就涇渭分明的三塊;但是這三塊是有序的,基準值左邊右邊的內
部數是無序的,所以,將基準值左右兩端繼續進行快速排序,直到區間長度為1,排序就完成了。
下面使用vs2013實現快速排序:
輸出為:
每種排序方式都會有最優的時間複雜度以及最差的時間複雜度,就像快速排序,你每次取出都取出整個陣列
中最小/最大的那個元素,那就是氣泡排序了,他的時間複雜度為t[n] = n * (n-1) = n^2 + n;也就是o( n^2 )
快速排序最優的情況就是每一次取到的元素都剛好平分整個陣列(上方**並不是最優情況);此時的時間複雜度公式則為:t[n] = 2t[n/2] + f(n);f[n] 就是第一次平分這個陣列時所花的時間;t[n/2]是平分後的兩邊陣列的時間複雜度,
下面來推算下,在最優的情況下快速排序時間複雜度的計算(用迭代法):
t[n] = 2t[n/2] + n ----第一次遞迴
令:n = n/2 = 2 + n ----第二次遞迴
= 2^2 t[ n/ (2^2) ] + 2n
令:n = n/(2^2) = 2^2 + 2n-----第三次遞迴
= 2^3 t[ n/ (2^3) ] + 3n
令:n = n/( 2^(m-1) ) = 2^m t[1] + mn ----第m次遞迴(m次後結束)
當最後平分的不能再平分時,也就是說把公式一直往**倒,到最後得到t[1]時,說明這個公式已經迭代完了(t[1]是常量了)。
得到:t[n/ (2^m) ] = t[1] ===>> n = 2^m ====>> m = lgn;
t[n] = 2^m t[1] + mn ;其中m = lgn;
t[n] = 2^(lgn) t[1] + nlgn = n t[1] + nlgn = n + nlgn ;其中n為元素個數
又因為當n >= 2時:nlgn >= n (也就是lgn > 1),所以取後面的 nlgn;
綜上所述:快速排序最優的情況下時間複雜度為:o( nlgn )
快速排序的使用空間是o(1);其主要的空間複雜都在遞迴上了
最優的情況下空間複雜度為:o(logn);每一次都平分陣列的情況
最差的情況下空間複雜度為:o( n );退化為氣泡排序的情況
問乙個問題:怎麼才能避免變成氣泡排序提高效率呢?
時間複雜度與空間複雜度
空間複雜度 space complexity 是對乙個演算法在執行過程中臨時占用儲存空間大小的量度,記做s n o f n 比如直接 插入排序 的時間複雜度 是o n 2 空間複雜度是o 1 而一般的 遞迴演算法就要有o n 的空間複雜度了,因為每次遞迴都要儲存返回資訊。乙個演算法的優劣主要從演算法...
時間複雜度與空間複雜度
本文是對時間複雜度以及空間複雜度的乙個理解 時間複雜度 由於環境的不同,同樣的 執行所需要的時間是不同的,所以是不能拿來比較的 而函式中執行的次數確實一樣的 所以時間複雜度就是 程式每個迴圈中的語句總共會執行的次數 時間複雜度的表示方法 大o漸進表示法 o f n 這裡的f n 是什麼呢?void ...
時間複雜度與空間複雜度
本文部分取自搜狗百科 在求演算法效率時,通常有事前分析和事後分析兩種方法,事後分析因為必須實際檢驗過後才能得出答案,且可能由於硬體方面等外部原因影響結果而不被推廣,事前分析的主要就是在考量乙個演算法的基本執行次數,這就是時間複雜度。時間複雜度 一般情況下,演算法中基本操作重複執行的次數是問題規模n的...