簡易的快速排序演算法說明

2021-10-04 14:03:01 字數 1581 閱讀 9245

快速排序是一種遞迴的思想,能實現o(nlogn)的時間複雜度

看到這個我首先想的就是要進行二分和遞迴了

那麼我們遞迴的模式就應該是把序列劃分成前後兩部分,並使得前一部分資料都比後一部分資料小。

這樣當遞迴完成後,資料就是有序公升序排列了。

那麼首先我們先有乙個需要被遞迴呼叫的函式quicksort(self,nums,l,r)對nums陣列內[l,r]部分進行排序,然後在遞迴呼叫它對(l,k),(k+1,r)進行排序

那麼問題的關鍵就是在這個quicksort裡面我們要做什麼了。

我們應當把序列劃分成乙個能從乙個位置斷開,然後前面的數都比後面的數小的序列。

第一種方法是把最後乙個數當作劃分節點。

然後選取第乙個下標i來從前向後進行掃瞄,掃瞄到第乙個比主元大的數,停下。

選取第二個下標j來從後向前掃瞄,掃瞄到第乙個比主元小的數,停下。

比較一下i和j的大小,如果i仍然小於j

就交換這兩個數的位置

然後重複上面的過程,只不過不要從開頭結尾掃瞄,可以省略掉已經掃瞄的內容了,直到idef

partition

(self,nums,l,r)

:## 選取最後乙個主元

p = nums[r]

i = l

j = r-

1while

true

:while nums[i]

< nums[r]

and i <= r:

i +=

1while nums[j]

> nums[r]

and j >= l:

j -=

1#交換二者位置

if inums[i]

,nums[j]

= nums[j]

,nums[i]

i +=

1 j -=

1else

:break

return j除此之外,由於我們不知道選取哪個數當這個劃分節點,我們也不妨直接隨機抽取一位幸運觀眾。

可以有函式實現為

def

partition

(self,nums,l,r)

:## 隨機選取主元

p = random.randint(l, r)

#隨機選取主元

nums[p]

, nums[r]

= nums[r]

, nums[p]

#和末尾交換位置

i = l -

1for j in

range

(l, r)

:if nums[j]

< nums[r]

:#每當有小於末尾(換過去的主元)時,交換位置

i +=

1 nums[j]

, nums[i]

= nums[i]

, nums[j]

i +=

1 nums[i]

, nums[r]

= nums[r]

, nums[i]

return i

演算法 簡易桶排序

前提說明 這只是本果初次接觸演算法,而且僅僅是桶排序的簡易模型,前輩們請繞道,感謝!簡介 實現思想 假如此時要對5個整數進行排序,而且數字的範圍已知的話,就可以使用桶排序啦。我們先假設數字範圍是1000以內吧,此時我們就要準備1001個桶,來存放這5個數字。為什麼是1001個桶呢,因為代表0 100...

排序演算法說明

排序演算法是 資料結構與演算法 中最基本的演算法之一。排序是乙個非常經典的問題,它以一定的順序對乙個陣列 或乙個列表 中的項進行重新排序 可以進行比較,例如整數,浮點數,字串等 增加,非遞減,遞減,增加,詞典等 有許多不同的排序演算法,每個都有其自身的優點和侷限性。排序通常被用作各種電腦科學課程中的...

排序演算法 快速排序演算法

網際網路的大型公司還在火熱招聘中,參與了一次又一次的筆試,都不通過,我還是太菜!作為程式設計人員,需要邁過去 資料結構與演算法 這個坎,畢竟,筆試不會真的很虧,加油吧,少些水,多點實操。一 快速排序演算法思想 從一組資料中找出乙個基準值,一般是選擇中間值作為基準值,然後從左到右將值與基準值進行比較,...