quick sort和heap sort

quick sort

分治思想,每次選中一個基準,然后為此基準找到合適位置,使得左邊全部小于此基準,右邊全部大于此基準。然后對左右兩邊的數(shù)組重復以上步驟。

如何為基準找到合適位置?同時從左往右、從右往左用下標掃描數(shù)組,如果分別掃描到<基準,>基準的樹,就交換他們位置,如果掃描過程中下標交叉,說明交叉點就是基準應該放置的位置。

go代碼


func portition(slice *[]int, start, end int) int {

    left := start + 1

    right := end

    for left <= right {

        for left <= right && (*slice)[left] <= (*slice)[start] {

            left++

        }

        for left <= right && (*slice)[right] >= (*slice)[start] {

            right--

        }

        if right <= left {

            break

        }

        tmp := (*slice)[left]

        (*slice)[left] = (*slice)[right]

        (*slice)[right] = tmp

    }

    log.Println(start, end, left, right)

    tmp := (*slice)[start]

    (*slice)[start] = (*slice)[right]

    (*slice)[right] = tmp

    return right

}

func sortInt(unsort *[]int, s, e int) {

    if s >= e {

        return

    }

    log.Println(unsort)

    mid := portition(unsort, s, e)

    sortInt(unsort, s, mid-1)

    sortInt(unsort, mid+1, e)

}

heap sort

有點類似冒泡,每次選出最大值放到最右邊,然后迭代。只不過采用完全二叉樹的形式去找最大值。

二叉樹:每個節(jié)點最多2個子元素

滿二叉樹 full binary tree:每個節(jié)點0或2個子元素

完全二叉樹 complete binary tree:剛好可以用數(shù)組完整表示的二叉樹。

步驟:

1.根據(jù)數(shù)組初始化heap,使得最大值在對頂,max-heap

2.將堆頂值與末尾值交換位置,然后再次構造max-heap

3.對步驟2迭代

java代碼
參考此連接
https://www.programiz.com/dsa/heap-sort

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容