# 利用快排思想
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:040找出无序数组中前K小的数
最新推荐文章于 2019-08-22 18:07:40 发布