Select Sort
主要思路:将列表分为有序区与无序区;与冒泡排序一样,每一趟都会选出一个数放入有序区,所以会有n-1趟(n为列表长度);从无序区中找最小值,将其与无序区的第一个数交换位置,则第一个数所在位置划为有序区,以此类推,无序区一直缩减,直到第n-1趟,无序区只剩一个数,这个数即为最大值,不用排
def Select_sort(list):
for i in range(len(list)-1): # 趟数
min_loc = i # 无序区中最小值的下标,假定第一个是最小值
for j in range(i+1,len(list)): # 在无序区中遍历
if list[j] < list[min_loc]: # 如果无序区中有比假定值小
min_loc = j # 更新最小值下标
list[i],list[min_loc] = list[min_loc],list[i]
return list
------------------------------------------------
list3 = [9,4,3,7,6,1,8,2,5]
print(Select_sort(list3))------->[1, 2, 3, 4, 5, 6, 7, 8, 9]
- 在无序区中,假定第一个元素为最小值,我们设定min_loc来记录最小值的下标
- 每一趟都是从无序区的第一个开始遍历,而且每一趟都选择出一个数放入有序区,所以第 i 趟就代表无序区从第 i 个开始
- 因为无序区第一个为假定最小值,所以需要与下一个比较,因此内层循环的开始需要在 i+1 处开始
- 内层循环中,遍历无序区,遇到比假定值小的就更新min_loc的值,因为:并不是每次遇到的都是最小的,更新下标,相当于记住了此时的值的位置,为了方便后续遍历完毕后,与无序区第一个元素交换位置
- 时间复杂度:O(n的平方)
这时可能就有人说了,python不是有一些方法可以直接找到最小值吗?
像这样:
def select_sort_simple(list):
list1 = []
for i in range(len(list)):
list1.append(min(list))
list1.remove(min(list))
return list1
------------------------------------------
list3 = [9,4,1,7,6,3,8,2,5]
print(select_sort_simple(list3))----->[1,2,3,4,5,6,7,8,9]
看着很简便,但是,这里的min()、remove()方法都是时间复杂度为O(n)的
整体上看,时间复杂度为O(n的平方),但是相较于上面的算法,这里的时间复杂度是要大得多的,而且空间复杂度也大了 ,因为需要开辟一个新列表来装入排好的数据。