三向切分的快速排序演算法中,怎麼保證大的在右,小的在左的?

時間 2021-06-09 19:59:01

1樓:facetothefate

首先明確一點,快排的核心思想是選擇乙個樞軸,左邊的都比樞軸小。右邊的都比樞軸大。

然後對分成的兩部分再進行遞迴快排。

那麼怎麼實現這個呢?

三向是這樣優化的。對於乙個陣列,一次掃瞄要有三個指標。

lt 為低指標,gt為高指標,i為當前遍歷元素。

首先我們選取乙個樞軸v。

掃瞄是如何進行的呢,我們利用這三個指標和lo,hi 標示陣列範圍的指標把陣列arr分成以下幾個部分。

其中,arr[lo]~arr[lt-1] 為小於v的元素。

arr[lt]~arr[gt]為等於v的元素。

arr[gt+1]~arr[hi]為大於v的元素。

特別的,在遍歷中。

arr[i]~arr[gt]為還沒決定的元素。

這樣一次分割槽以後,我們就可以有效減少重複元素的消耗了,因為重複的樞軸都集中到了arr[lt]~arr[gt]這個區間裡,我們遞迴可以不用在對這一部分進行分割槽了。

好了,清楚了三向快排的優化基礎,再回過頭來看看你的問題。

首先,你要知道的是,arr[i]~arr[gt]為還為決定的元素,在這一時刻,我們只用保證我們挪到後面的元素比樞軸大就行了,所以能夠確定的是gt要減一,因為我們確實挪動了乙個大於樞軸的元素到了後面,但是i不能動,因為還沒確定新換來的這個元素跟樞軸的大小關係。至於arr[i] 跟 arr[gt]的大小關係,我們不關心也不在意,因為我們是再用樞軸v分割槽,而不是再用arr[i]分割槽。

第二,如果你仔細看了我說的三向快排的原理,就知道,這個優化是通過把重複元素集中來減少遞迴次數的。標準快排的演算法是從前往後找到乙個比樞軸大的,從後往前找乙個比樞軸小的,交換。

想想看,這個演算法能達到將重複的樞軸集中的效果嗎?

張三向李四借了五千元,張三到期不還,李四發現張三帶著五千元,就偷了過來。誰的錯,如何判決?

公安法醫 如果李四偷了以後告訴了張三,表示錢自己已經拿到手了,借的錢不用還了,這時候應該不構成盜竊罪。盜竊罪要有非法占有的目的,這個情況只能算是私立的救濟,不僅僅是盜竊不成犯罪,就是拿刀子逼著張三把錢拿出來同樣也是不構成搶劫的。 環境保護法的學生 法律分析意見 1 李四對張三系民間借貸法律關係,李四...

向領導反映直系領導不好的地方,現在被抱團排擠了,怎麼破

倩兒暖暖 沒後悔藥,已經這樣了,兩個辦法,一時做好手頭的工作,別被人捉到把柄,不然會被無限放大,然後給你貼標籤的,如果已被貼標籤了,一群人排擠你,那也有好處啊,你看他們本來各有心思,在排擠你上卻突然團結,讓他們團結好了,一你不用應酬他們了,二你省去辯識他們的時間,時間就是錢,挺好。二,不開心吧,千萬...

《三體》中的「二向箔」即然可以讓三維空間向二維跌落,哪麼能不能像神筆馬良的畫一樣讓二維向三維過渡?

由於空間存在乙個最小尺度,這意味著空間內的在物理學上有意義的點的數量是有限的,因此降維是可行的。但是,除非降維時使用了類似於 希爾伯特曲線 這種類似的演算法,使得某個降維之前的點能對應到降維之後的點。否則從高維空間對映到低維空間的運算往往是乙個不可逆變換,以三維變二維為例,原本隱藏在第三個維度中的位...