目录
1、选择排序
选择排序一般的应用场景就是将列表中的元素从大到小排列(或者从小到大排列)。一般实现的步骤就是遍历一个列表,每次找出列表中最大(或者最小)的元素,并将该元素添加到一个新的列表中。
2、代码实现
从选择排序的一般步骤中我们可以将代码分成两个步骤,首先编写一个找出数组中最大(或者最小)元素的函数,接着将找出最大(最小)元素放入新列表中,完成选择排序。
下面的代码以找出列表中最小的元素为例:
def findSmallest(arr):
smallest = arr[0]
smallest_id = 0
for i in range(1,len(arr)):
if arr[i]<smallest:
smallest = arr[i]
smallest_id = i
return smallest_id
def Selection_sort(arr):
newarr = []
for i in range(len(arr)):
print(f"第{i}轮遍历")
smallest_id = findSmallest(arr)
print(f"此轮最小的数为:{arr[smallest_id]}")
newarr.append(arr.pop(smallest_id))
print(f"此轮结束后arr:{arr}")
print(f"此轮结束后newarr:{newarr}")
print("\n")
return newarr
arr = [1,6,3,9,0,4]
newArr = Selection_sort(arr)
print(newArr)
运行后的结果为:
第0轮遍历
此轮最小的数为:0
此轮结束后arr:[1, 6, 3, 9, 4]
此轮结束后newarr:[0]
第1轮遍历
此轮最小的数为:1
此轮结束后arr:[6, 3, 9, 4]
此轮结束后newarr:[0, 1]
第2轮遍历
此轮最小的数为:3
此轮结束后arr:[6, 9, 4]
此轮结束后newarr:[0, 1, 3]
第3轮遍历
此轮最小的数为:4
此轮结束后arr:[6, 9]
此轮结束后newarr:[0, 1, 3, 4]
第4轮遍历
此轮最小的数为:6
此轮结束后arr:[9]
此轮结束后newarr:[0, 1, 3, 4, 6]
第5轮遍历
此轮最小的数为:9
此轮结束后arr:[]
此轮结束后newarr:[0, 1, 3, 4, 6, 9]
[0, 1, 3, 4, 6, 9]
从上面运行后的结果可见:
选择排序在每轮中,选出arr中最小的元素,将其从arr中pop出来, 并将该元素放入newarr中,直到arr为空。排序后的结果就是newarr。
3、时间复杂度和空间复杂度
空间复杂度:只需要常数个辅助单元,所以空间复杂度为O(1)
时间复杂度:我们看到选择排序同样是双层循环n*(n-1)),所以时间复杂度也为:O(n^2)
稳定性:因为存在任意位置的两个元素交换,比如[5, 8, 5, 2],第一个5会和2交换位置,所以改变了两个5原来的相对顺序,所以为不稳定排序。
是否为原地排序: 是原地排序