topk问题-冒泡排序

一、工作原理

使用升序冒泡排序,每趟获得无序区的最大值,只需要运行k趟即可。输出前k大的数值,可采用新列表存储、切片和挨个print的方法。

二、代码实现

# topk问题——冒泡排序
'''
description: 
param {*} li:列表
param {*} k:取最大前k个数
return {*}
'''
def topk_bubble1(li, k):  #创建空列表存数
    result = [] 
    for i in range(k): # 第i趟,完全的冒泡排序一共n-1趟,只取前k个数,经过k趟
        for j in range(len(li)-i-1): #range内为无序区范围,j指针不指向最后一个元素
            if li[j] > li[j+1]:  # 前一个数大于后一个数
                li[j+1], li[j] = li[j], li[j+1] #交换两个数的位置
        result.append(li[len(li)-i-1]) # 取第i趟获得的最大数,即该趟无序区排序后得到的最后一个元素
    return result
    
#在排序中切片
def topk_bubble2(li, k):
    n = len(li) # 列表长度
    for i in range(k):
        for j in range(n-i-1):
            if li[j] > li[j+1]:
                li[j], li[j+1] = li[j+1], li[j]
    result = li[(n-k):n] #切片,切片包前不包后
    return result

def topk_bubble3(li, k):
    n = len(li) # 列表长度
    for i in range(k):
        for j in range(n-i-1):
            if li[j] > li[j+1]:
                li[j], li[j+1] = li[j+1], li[j]
        print(li[n-i-1], end = " ")  #打印每次无序区排序的最后一个元素,即冒出来的数


lis = [1,4,5,3,6,2]
res1 = topk_bubble1(lis,2)
res2 = topk_bubble2(lis,2)

print(res1)
print(res2)
topk_bubble3(lis,2)

结果输出:

[6, 5]
[5, 6]
6 5

你可能感兴趣的:(python数据结构与算法,python,排序算法)