快速排序是一種遞迴的思想,能實現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...
排序演算法說明
排序演算法是 資料結構與演算法 中最基本的演算法之一。排序是乙個非常經典的問題,它以一定的順序對乙個陣列 或乙個列表 中的項進行重新排序 可以進行比較,例如整數,浮點數,字串等 增加,非遞減,遞減,增加,詞典等 有許多不同的排序演算法,每個都有其自身的優點和侷限性。排序通常被用作各種電腦科學課程中的...
排序演算法 快速排序演算法
網際網路的大型公司還在火熱招聘中,參與了一次又一次的筆試,都不通過,我還是太菜!作為程式設計人員,需要邁過去 資料結構與演算法 這個坎,畢竟,筆試不會真的很虧,加油吧,少些水,多點實操。一 快速排序演算法思想 從一組資料中找出乙個基準值,一般是選擇中間值作為基準值,然後從左到右將值與基準值進行比較,...