#输入n个整数,找出其中最小的k个数
#思路1:冒泡排序:相邻这个数两两比较,按从小到大顺序交换
def findMin_k(arr,k):
length = len(arr)
for i in range(k):
for j in range(i+1,length):
if arr[i]>arr[j]:
arr[i],arr[j] = arr[j],arr[i]
return arr[0:k]
#思路2:基于快排的思路--指定一个key,在partition函数中完成一轮的比较结果是比key大的都排到其右边,比key小的都排到左边,完成该轮后返回left=right时left的值
def partiiton(arr,left,right):
key = arr[left]
while left<right:
while left < right and arr[right]>=key:
right-=1
arr[left] = arr[right]
while left<right and arr[left] <= key:
left +=1
arr[right] = arr[left]
arr[right] = key
#之后判断left的值比key大还是比key小
# 若left的值比key大,说明在上次partition之后,arr中前left个小的数在左边,其余数在右边,需要缩小范围,下次只需要在数组前left个数中找
#若left的值比key小,说明在上次partition之后,前left个数找的太少了,需要在往数组后面找
def findMin_k2(arr,k):
length = len(arr)
left = 0
right = length-1
index = partiiton(arr,left,right)
while k != index:
if index > k-1:
right = index-1
else:
left = index+1
index = partiiton(arr,left,right)
return arr[0:k]
#思路3:可以创建大小为k的容器,用来存储k个数字,接着从输入的数组中读入一个数字,若容器中的数字少于k
#则放入;若容器已满,则拿容器中的最大值来于此数字比较,若小于则替换,否则丢弃此数字
lists = [1, 1, 6, 4, 11, 9, 2, 10, 3]
def findMin_k3(list, k):
# 创建大小为k的数组
a = []
for i in range(len(list)):
if len(a) < k:
a.append(list[i])
else:
if max(a) > list[i]:
a[a.index(max(a))] = list[i]
return a
最小K个数--python
最新推荐文章于 2023-01-15 14:14:06 发布