列表排序並返回索引 ghpython 快速排序

2021-10-11 21:17:52 字數 2717 閱讀 8370

今天咱們來用ghpython學習另一種列表排序演算法,快速排序。

快速排序,看其名稱就顯得簡單粗暴,就講究乙個快字。快速排序也是一種利用分治法來實現對列表進行排序的演算法。

今天分享了三種思路,其中有一種是來自老潘的微博,個人感覺還是老潘的思路更加淺顯易懂。

#快速排序"""下邊的**具體的實現形式:以列表第乙個元素為pivot,兩個指標分別指向列表的第乙個元素和最後乙個元素將右邊的指標從後往前移動,如果元素大於pivot,則指標直接向前移動,否則,將小於pivot的元素賦值給前面指標所對應的元素將左邊的指標從前往後移動,如果元素小於pivot,則指標直接向後移動,否則,將大於pivot的元素賦值給後邊指標所對應的元素當兩個指標相遇,將pivot值賦值給其中乙個指標對應的元素,完成第一輪遍歷,達到將列表以pivot為界,拆分為前後兩個子列表的目的然後繼續呼叫自身函式,對子列表進行遍歷排序,如此反覆,完成整個列表的排序"""#利用隨機模組生成初始無序列表import random as randlst=rand.sample(range(-x,x),num)print("隨機生成的列表為:%s" % lst)#定義快速排序def quick_sort(lst,left,right):    #遞迴的出口,如果最小索引值大於等於最大索引值,說明列表最多只有1個元素    #本身即為有序序列,可以直接返回    if left>=right:        return lst    #定義pivot,i,j的初始值    pivot,i,j=lst[left],left,right    #外邊的while迴圈用來控制第一輪遍歷是否完成    while i        #用來控制右邊指標向前移動,發現比pivot小的值,則賦值給前邊指標對應的元素        while iand lst[j]>=pivot:            j-=1        lst[i]=lst[j]        #用來控制左邊指標向後移動,發現比pivot大的值,則賦值給後邊指標對應的元素        while iand lst[i]<=pivot:            i+=1        lst[j]=lst[i]    #第一輪遍歷完全,左右指標相遇,將pivot值賦值給指標對應的元素    lst[j]=pivot    #繼續對兩個子列表執行遞迴操作    quick_sort(lst,left,i-1)    quick_sort(lst,i+1,right)quick_sort(lst,0,len(lst)-1)print("快速排序後的列表:%s" % lst)

#快速排序"""下邊的**具體的實現形式:以列表最後乙個元素為pivot,同時以列表的索引值的最小值減1作為指標的起始位置,作為慢指標,然後根據索引值遍歷列表的每乙個元素,用來遍歷的索引值相當於乙個快指標,如果發現比pivot小的元素,慢指標向右移動一位,並將快慢指標的值交換,然後快指標繼續往右移動,直到遍歷到列表的倒數第二個元素終止最後將pivot元素與慢指標加1的元素交換,這樣實現了將列表以pivot為界,劃分為前後兩個列表,前邊的列表元素都比pivot小,後邊的列表元素都比pivot大然後再分別對前後兩個列表遞迴呼叫快速排序函式,最終列表的起始索引值和終止索引值肯定會相等,表示列表只有乙個元素,則遞迴終止,完成列表的排序"""#利用隨機模組生成初始無序列表import random as randlst=rand.sample(range(-x,x),num)print("隨機生成的列表為:%s" % lst)#定義分割槽函式def partition(lst,low,high):    i=low-1     #慢指標初始位置    pivot=lst[high]    #最後乙個元素作為pivot    #以索引值遍歷列表的每乙個元素(取不到最後乙個值)    #如果發現不大於pivot的值,則將慢指標右移一位,並將兩個值交換,    #也就是將較小值進行存放    for j in range(low,high):        if lst[j]<=pivot:            i+=1            lst[i],lst[j]=lst[j],lst[i]    #將最後乙個元素與慢指標的下乙個元素交換    #並返回pivot在最終列表的準確索引值    lst[i+1],lst[high]=lst[high],lst[i+1]    return (i+1)#定義快速排序函式def quick_sort(lst,low,high):    #一般分別取列表的第乙個元素和最後乙個元素的索引值分別為low和high的初始值    #如果low    #想法,如果不滿足low    if low        index=partition(lst,low,high)        #分別對兩個子列表進行遞迴        quick_sort(lst,low,index-1)        quick_sort(lst,index+1,high)quick_sort(lst,0,len(lst)-1)print("快速排序後的列表:%s" % lst)
歡迎關注「顏犀設」知乎專欄和知識星球。

python 列表 返回 所有 元素 索引

在列表中使用index方法獲取的只是第乙個索引,比如想獲取列表中的字元 a lst a 1,4,2,a 3 lst.index a 0 如果想獲取所有 a 元素的索引列表,可以借助於下面的方法 def get index1 lst none,item tmp tag 0 for i in lst i...

陣列排序並找出元素索引

題目描述 先給陣列排序,然後找到指定的值在陣列的位置,最後返回位置對應的索引。舉例 where 1,2,3,4 1.5 應該返回 1。因為1.5插入到陣列 1,2,3,4 後變成 1,1.5,2,3,4 而1.5對應的索引值就是1。同理,where 20,3,5 19 應該返回 2。因為陣列會先排序...

查詢陣列中的某個元素並返回其索引

遍歷查詢 直接使用for迴圈從頭到尾遍歷查詢 public class arraydemo01 根據元素查詢出該元素在陣列中第一次出現的索引 int index getindexbyele arr,6 system.out.println 該元素第一次出現在陣列中的索引是 index private...