年後放假回來得了假期症候群,懶勁上來了,之前一直想更新的部落格一拖再拖,再拖下去自己都不好意思了。
前幾天看了看各個大廠的安卓面試題,發現大廠的安卓面試都會在最後考一道快速排序演算法,演算法對於我現在來說不太熟練,就跟著網上的敲了一下,就在這裡做下總結。
網路上有總結快速排序演算法的複雜度為nlogn。這裡的nlogn表示為演算法的時空複雜度。標準寫法為o(n*logn)。時間複雜度為o(n),代表的是資料量增大多少倍,耗時就增大多少倍。而o(logn
)代表的是當資料增大n倍時,耗時增大logn倍(這裡是
log 2
n\log_2 n
log2n
)而o(nlogn)就是當資料增大n倍時,耗時增大nlogn倍,當資料增大256倍時,耗時增大256*8倍。
原理思想就是每一次排序都找到乙個基準元素,將小於基準元素的元素放在基準元素的左邊,將大於基準元素的元素放在基準元素的右邊。通過這個描述大概就知道了,快速排序的關鍵是找到這個基準元素。
private
funquicksort
(array: intarray, left: int, right: int)
//進行第一輪排序獲取分割點
val index =
partition
(array, left, right)
//排序前半部分
quicksort
(array, left, index -1)
//排序後半部分
quicksort
(array, index +
1, right)
tv_result.text = array.
tostring()
}private
funquick
(array: string)
if(array.
isnotempty()
)}
以上是快速排序的的實現部分,其中乙個方法非常關鍵,就是partition()。這個方法用來確定基準元素。
private
funpartition
(array: intarray, left: int, right: int)
: int
//將基準元素與array[nextelement]交換
val tag = array[left]
array[left]
= array[lastelement]
array[lastelement]
= tag
//返回基準元素所在位置
return lastelement
}
經過比照發現,數值比較少的時候插入排序演算法比快速排序演算法更快,效率更高。足見「快排」只是平均效能最好。
最近由快排延伸去研究了一下別的排序演算法,算是對於演算法第一次細緻研究。演算法這東西,還是挺有搞頭的,鍛鍊數學技能。之後有機會再去研究其他的常用演算法,畢竟要多多少少了解一下。
Android 系統字型規範與應用探索
檔案中得未上傳 建議閱讀原文 android 系統字型規範與應用探索白群 1.移動設計中與字型大小有關的基本概念 l sp 與 px 的換算公式 sp ppi 160 px 2.android 系統預設字型 rotobo,限定使用以下字型大小 3.android 字型單位sp與 px的換算 l pp...
氣泡排序與選擇排序的不同 快速排序與選擇排序的結合
氣泡排序可以說是最簡單的排序了。我們學習c語言迴圈的時候都會提到。可見這是一種淺而易懂的排序演算法!但不見得這種演算法就沒用處。首先,他很容易理解,這樣在各種教材中比較適合拿來 開門見山 其次是他很穩定。若明確知道即將排的數字很混亂,隨機性很強,則用氣泡排序也未償不可。誰讓他始終是o n 2 呢。氣...
氣泡排序與選擇排序的不同 快速排序與選擇排序的結合
氣泡排序與選擇排序的不同 快速排序與選擇排序的結合 氣泡排序可以說是最簡單的排序了。我們學習c語言迴圈的時候都會提到。可見這是一種淺而易懂的排序演算法!但不見得這種演算法就沒用處。首先,他很容易理解,這樣在各種教材中比較適合拿來 開門見山 其次是他很穩定。若明確知道即將排的數字很混亂,隨機性很強,則...