JZ29 最小的K个数
my version
选择排序
时间复杂度O(kn)
class Solution:
def GetLeastNumbers_Solution(self, tinput, k):
for i in range(k):
min_idx = i
for j in range(i+1, len(tinput)):
if tinput[min_idx] > tinput[j]:
min_idx = j
tinput[i], tinput[min_idx] = tinput[min_idx], tinput[i]
return tinput[:k:]
book method1
时间复杂度O(n)
快排分区partition
import random
random.seed(0)
class Solution:
def partition(self, arr, start, end):
idx = random.randint(start, end)
arr[idx], arr[end] = arr[end], arr[idx]
small = start-1
for i in range(start, end):
if arr[i] < arr[end]:
small += 1
arr[small], arr[i] = arr[i], arr[small]
small += 1
arr[small], arr[end] = arr[end], arr[small]
return small
def GetLeastNumbers_Solution(self, tinput, k):
if not tinput or len(tinput) < k or not k:
return []
start = 0
end = len(tinput) - 1
idx = self.partition(tinput, start, end)
while idx != k-1:
if idx > k-1:
end = idx -1
idx = self.partition(tinput, start, end)
else:
start = idx + 1
idx = self.partition(tinput, start, end)
return tinput[:k:]
book method2
时间复杂度O(nlogk)
堆排序