选择排序

选择排序

循环遍历列表,每次找到最小的一个数,放到一个新列表中

简单版

def select_sort_simple(lst):
    new_lst = []
    for i in range(len(lst)):  # 总共需要遍历多少遍
        min_val = min(lst)
        new_lst.append(min_val)
        lst.remove(min_val)
    return new_lst


lst = [99, 77, 1, 2, 7, 4, 5, 3, 66, 88]
ret=select_sort_simple(lst)
print(ret)

以上方式存在缺陷,如果列表数据量大,在开辟一个新列表,占用的内存就是2倍大,冒泡排序是原地排序,同时min()方法和remove()方法都增加了复杂度,min()会占一个O(N)的复杂度,remove()占一个O(N)的复杂度, for循环一个O(N)的复杂度,所有加起来并不是三个O(N)的复杂度,是O(N)2次方

优化版-原地排序

 

 

 

def select_sort(lst):
    """
    每次找最小的数,跟最前面的数依次进行交换
    :param lst:
    :return:
    """
    for i in range(len(lst) - 1):  # 跟冒泡排序一样一共需要n-1趟
        # 无序区的范围,第0趟时候范围(0,最后),第1趟时候范围(1,最后),第i趟时候范围(i,最后)
        min_loc = i  # 记录最小数的位置(下标),无序区第一个数的位置
        for j in range(i + 1, len(lst)):
            if lst[j] < lst[min_loc]:
                min_loc = j
        # 内层for循环结束,找到了最小数的下标,此时用无序区的第一个数,跟它交换
        lst[i], lst[min_loc] = lst[min_loc], lst[i]
        print(lst)

lst = [99, 77, 1, 2, 7, 4, 5, 3, 66, 88]
select_sort(lst)
# print(lst)
优化代码

 

posted @ 2022-10-31 00:37  断浪狂刀忆年少  阅读(29)  评论(0)    收藏  举报