Android探索與鞏固(快速排序算法)

Android探索與鞏固(快速排序算法)

前言

​ 年後放假回來得了假期綜合徵,懶勁上來了,之前一直想更新的博客一拖再拖,再拖下去自己都不好意思了。

前幾天看了看各個大廠的安卓面試題,發現大廠的安卓面試都會在最後考一道快速排序算法,算法對於我現在來說不太熟練,就跟着網上的敲了一下,就在這裏做下總結。

快速排序算法

​ 網絡上有總結快速排序算法的複雜度爲nlogn。這裏的nlogn表示爲算法的時空複雜度。標準寫法爲O(n*logn)。時間複雜度爲O(n),代表的是數據量增大多少倍,耗時就增大多少倍。而O(Logn

)代表的是當數據增大n倍時,耗時增大logn倍(這裏是
log2n \log_2 n
)而O(nlogn)就是當數據增大n倍時,耗時增大nlogn倍,當數據增大256倍時,耗時增大256*8倍。

原理思想就是每一次排序都找到一個基準元素,將小於基準元素的元素放在基準元素的左邊,將大於基準元素的元素放在基準元素的右邊。通過這個描述大概就知道了,快速排序的關鍵是找到這個基準元素。

算法實現

private fun quickSort(array: IntArray, left: Int, right: Int) {
    if (left >= right) {
        return
    }
    //進行第一輪排序獲取分割點
    val index = partition(array, left, right)
    //排序前半部分
    quickSort(array, left, index - 1)
    //排序後半部分
    quickSort(array, index + 1, right)
    tv_result.text = array.toString()
}

private fun quick(array: String) {
    val arr = IntArray(array.length)
    for (i in 0 until array.length) {
        arr[i] = Integer.parseInt(array.substring(i, i + 1))
    }
    if (array.isNotEmpty()) {
        quickSort(arr, 0, arr.size - 1)
    }
}

以上是快速排序的的實現部分,其中一個方法非常關鍵,就是partition()。這個方法用來確定基準元素。

private fun partition(array: IntArray, left: Int, right: Int): Int {
    //第一個爲基準元素
    val baseElement = array[left]
    var nextElement = left + 1
    var lastElement = right
    while (true) {
        while (nextElement <= right && array[nextElement] < baseElement) nextElement++
        while (lastElement > left && array[lastElement] > baseElement) lastElement--
        //循環終止條件
        if (nextElement > lastElement) break
        // 交換 array[nextElement]與array[lastElement]
        val tag = array[nextElement]
        array[nextElement] = array[lastElement]
        array[lastElement] = tag
        nextElement++
        lastElement--
    }
    //將基準元素與array[nextElement]交換
    val tag = array[left]
    array[left] = array[lastElement]
    array[lastElement] = tag

    //返回基準元素所在位置
    return lastElement
}

經過比照發現,數值比較少的時候插入排序算法比快速排序算法更快,效率更高。足見“快排”只是平均性能最好。

最後總結

​ 最近由快排延伸去研究了一下別的排序算法,算是對於算法第一次細緻研究。算法這東西,還是挺有搞頭的,鍛鍊數學技能。之後有機會再去研究其他的常用算法,畢竟要多多少少了解一下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章