排序演算法-快速排序

weixin_34194087發表於2018-02-06

快速排序演算法的核心是在一個陣列中,將第一個元素放置在中間位置使這個陣列變為左邊比這個元素都小,右邊比這個組都大的一個陣列。

程式碼實現這個過程如下

// 找出arr[l...r]的分界點j
// 使其分為arr[l,j] arr[j+1,r]兩部分
func partition(arr []int, l, r) int {
    // j為當前找到的分界點
    // v為做為分界點的值
    j, v := l, arr[l]
    // i為當前正在考察的元素
    for i := l+1; i <= r; i++ {
        if arr[i] < v {
            arr[j+1], arr[i] = arr[i], arr[j+1]
            j++
        }
    }
    a[j], a[l] = a[l], a[j]
    return j
}

然後快速排序就是遞迴呼叫這個方法,將整個陣列分為兩部分,繼續再分為四部分,直到每個陣列只有一個元素就完成了排序
程式碼如下:

// QuickSort 快速排序
func QuickSort(arr []int) {
    quickSort(arr, 0, len(arr)-1)
}

// 對arr的[l,r]快速排序
func quickSort(arr []int, l int, r int) {
    if l >= r {
        return
    }
    p := partition(arr, l, r)
    quickSort(arr, l, p-1)
    quickSort(arr, p+1, r)
}

// 找出arr的[l,r]的標識點
func partition(arr []int, l int, r int) int {
    // arr[l+1:j] < v arr[j+1:i) > v
    // i為正在考察的元素
    v, j := arr[l], l
    for i := l + 1; i <= r; i++ {
        if arr[i] < v {
            arr[j+1], arr[i] = arr[i], arr[j+1]
            j++
        }
    }
    arr[j], arr[l] = arr[l], arr[j]
    return j
}

相關文章