Partition算法以及其應用詳解上(Golang實現)

最近像在看閒書同樣在看一本《啊哈!算法》算法

當時在amazon上面閒逛挑書,看到巨多人推薦這本算法書,說深刻淺出簡單易懂便買來閱讀。實際上做者描述算法的能力的確使人佩服。就當複習經常使用算法吧。數組

後面會依次紀錄一下我以爲有意思的經常使用算法使用,此次就是快排。函數

 

快速排序簡介:ui

快排的中心思想仍是二分法,經過partition算法,先將須要排序的數組分爲兩個部分,再用遞歸的思想反覆這個過程。最後將排序好的最小單元再依次組裝起來得到最後的數據。快排的平均時間複雜度是O(nlogN),最糟糕的狀況是O(N平方)。spa

 

Partition算法:指針

partition算法是一種分類算法,簡單來講就把一個序列分紅先後兩部分,前一部分都是知足某一條件的元素,後一部分都是不知足該條件的元素。最著名的應用可能就是快速排序中的partition了。咱們先找出一個元素,而後以該元素爲基準點將小於他的所有放置到一邊,將大於他的數所有放置到另一邊。最後返回pivot索引位置。這裏咱們默認使用數組的第一個數做爲pivot
code

下面來看快速排序中partition的實現:blog

func partition(left int, right int, list []int) (int) {
    i := left
    j := right
    temp := list[left]

    for i != j {
        for i < j && list[j] >= temp {
            j--
        }

        for i < j && list[i] <= temp {
            i++
        }

        if i < j {
            list[i], list[j] = list[j], list[i]
        }
    }
    list[left], list[i] = list[i], list[left]
   return i }

咱們接收數組,左起始點,右結束索引做爲參數。排序

默認將數組的第一個數做爲索引點,而後將小於他的數放置在左邊,將大於他的數放置在右邊。遞歸

 

快速排序:

經過遞歸partition函數咱們就能始終將數分紅左右兩邊,最後再合併起來就能夠了。

因此實際快速排序只是在partition算法的基礎上使用遞歸法。最後獲取結果。上面的partition算法我使用了兩根指針同時從左右兩邊進行掃描。把掃描到的左右兩個數調換位置,從而二分效率。

完整的代碼:

func quickSort(left int, right int, list []int) {
    if left >= right {
        return
    }

    i := left
    j := right
    temp := list[left]

    for i != j {
        for i < j && list[j] >= temp {
            j--
        }

        for i < j && list[i] <= temp {
            i++
        }

        if i < j {
            list[i], list[j] = list[j], list[i]
        }
    }
    list[left], list[i] = list[i], list[left]

    quickSort(left, i, list)
    quickSort(i+1, right, list)
    return
}

 

 

Reference:

《啊哈!算法》-> 啊哈磊著

相關文章
相關標籤/搜索