# 利用快排思想
class solution:
def function(self, array, k):
index = self.partition(array, 0, len(array)-1)
while index != k-1:
if index > k-1:
index = self.partition(array, 0, index-1)
if index < k-1:
index = self.partition(array, index+1, len(array)-1)
print(array[0:k])
def partition(self, array, start, end):
i = start
j = end
while i < j:
while array[j] >= array[start] and i < j: # 必須左邊先動 以陣列第乙個數作為哨兵,找到小於(不能小於等於,不然會卡在哨兵那裡)哨兵的數
j -= 1
while array[i] <= array[start] and i < j: # 以陣列第乙個數作為哨兵,找到大於(不能大於等於)哨兵的數
i += 1
# 交換
temp = array[j]
array[j] = array[i]
array[i] = temp
"""當指標相碰的時候,指標指向的數,一定大於哨兵
指標相碰的兩種情況:
1.j向左一步,與i相碰
1.1 i沒有動過
相碰的地方是哨兵
1.2 i動過
根據上一次的交換,i指向的數字一定是小於哨兵,所以i指向的數與哨兵交換,合理
2.i向右一步,與j相碰
這種情況只發生在j沒有動過的時候,相碰的地方就是最後乙個資料,因為程式裡面是j先動,根據上次的交換,array[j],一定大於哨兵
即滿足j移動的條件。
綜上,最後i指向的數子一定小於等於哨兵,(等於僅僅在1.1情況發生),所以,再進行一次交換,一趟完成
"""temp = array[start]
array[start] = array[i]
array[i] = temp
return i
if __name__ == '__main__':
# 測試用例
a = [99, 2, 1, 4, 5, 6, 9, 8, -1]
s = solution()
s.function(a, 5)
劍指Offer之有序陣列查詢
在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。1 2 8 9 2 4 9 12 4 7 10 13 6 8 11 15 如題所示,它的行和列都是遞增的。那麼我們需要試圖找到邊界點,...
劍指offer 找出陣列中重複的數字
問題 在乙個長度為n的陣列裡的所有數字都在0 n 1的範圍裡,不知道重複的數字,也不知道每個重複數字重複幾次,找出陣列中所有重複的數字,如輸入,則應輸出。要求1 能改變陣列中的數字 思路1 將陣列排序,然後遍歷陣列,找出重複的數字。時間複雜度o nlogn 空間複雜度o 1 思路1的實現 vecto...
劍指offer 找出陣列中重複的數字
題目 在乙個長度為n的陣列裡的所有數字都在0 n 1的範圍內。陣列中某些數字是重複的,但是不知道有幾個數字重複了,也不知道每個數字重複了幾次,請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼輸出的重複數字2或者3.分析 陣列中的數字為0 n 1的範圍內,如果再這個陣列中不存在重複的...