选择排序算法
1. 常见排序算法的时间复杂度:
- 时间复杂度为 O(N ^ 2) 的有:选择排序、冒泡排序、插入排序
- 时间复杂度为 O(N * log N) 的有:归并排序、快速排序
- 时间复杂度为O(N * log N)的算法比时间复杂度为 O(N ^ 2)的算法好的多
- 时间复杂度就相当于数组的长度N与执行时间的关系
- 时间复杂度的表示,按算最坏的情况看,而且忽略常数时间(执行时间确定的时间)
- 算法的时间复杂度表示相同,它的区别是常数时间不同,但要排序的数组长度很长时,常数时间的影响可以忽略不计
2. 选择排序
选择排序是一种灵巧的算法,但其速度不是很快运行时间为O(n2)。快速排序是一种更快的排序算法,其运行时间为O(n * log n),这将在其它篇章介绍。
随着排序的进行,每次需要检查的元素数在逐渐减少,最后一次需要检查的元素都只有一个。既然如此,运行时间怎么还是O(n2)呢?
问得没错,并非每次都需要检查n个元素。第一次需要检查n个元素,但随后检查的元素数依次为n - 1, n – 2, …, 2和1。平均每次检查的元素数为1/2 × n,因此运行时间为O(n × 1/2 × n)。但这种关系的表示法省略诸如1/2这样的常数,因此简单地写作O(n × n)或O(n2)。
示例代码:
# 先编写一个用于找出数组中最小元素的函数。
def findSmallest(arr):
smallest = arr[0] # 存储最小的值
smallest_index = 0 # 存储最小元素的索引
# 遍历数组中的每个每个元素,找出最小的
for i in range(1, len(arr)):
if arr[i] < smallest:
smallest = arr[i]
smallest_index = i
return smallest_index
# 现在可以使用这个函数来编写选择排序算法了。
def selectionSort(arr):
newArr = [] # 新的数组
# 遍历数组中的每个元素,找出数组中最小的元素,并将其加入到新数组中
for i in range(len(arr)):
smallest = findSmallest(arr)
newArr.append(arr.pop(smallest))
return newArr