选择排序
循环遍历列表,每次找到最小的一个数,放到一个新列表中
简单版
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)优化代码
标签:sort,loc,min,复杂度,选择,lst,排序,select From: https://www.cnblogs.com/TodayWind/p/16842879.html