#定義交換元素
def swap(sn,left,right):
sn[left], sn[right] = sn[right], sn[left]
#尋找快速排序基準元素 采用不同取大
def findpivot(sn,left,right):
if sn[left] <= sn[left+1]:
swap(sn,left,left+1)
#基于快速排序劃分尋找 第k小的元素
def findk(sn,left,right,k):
findpivot(sn,left,right)
i = left
j = right
base = sn[left]
print(sn)
#從右向左移動,遇到小于base的,從左向右移動,遇到大于base的交換位置
while i < j:
while i<j and sn[j] >= base:
j = j-1
while i<j and sn[i] <= base:
i = i+1
if i<j:
swap(sn,i,j)
if i == j and sn[i] < base:
swap(sn,left,i)
#進行第一次交換之后,看i與k-1的關系,如果是i>k-1,則對i之前的進行排序
while i != k - 1:
if i > k-1:
findk(sn,left,i-1,k)
#如果i<k-1,對i后面的進行排序
if i < k-1:
findk(sn,i+1,right,k-i)
print(sn[k-1])
return
sn = [3,1,4,9,2,6,5,30,32,34]
findk(sn,0,len(sn)-1,4)


謝謝大佬~~~
uj5u.com熱心網友回復:
你的函式都沒有回傳值的。uj5u.com熱心網友回復:
如果你僅僅是想回圈排序,找第k小的元素,可以這樣寫
def finds(nums, num):
n = num
while num > 0:
for i in range(len(nums)-1):
if nums[i] > nums[i+1]:
nums[i], nums[i+1] = nums[i+1], nums[i]
num -= 1
return nums, nums[n-1]
nums = [3, 1, 4, 9, 2, 6, 5, 30, 32, 34]
print(finds(nums, 4))
uj5u.com熱心網友回復:
哦哦好的~謝謝 其實我是想用快速排序的思想,遞回的找第k小的元素~我覺得應該是遞回的時候一直回圈了請問這時候應該怎么辦呢~感謝!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/122829.html
上一篇:用turtle寫名字
