选择排序
选择排序
什么是选择排序
- 选择排序是一种简单且直观的排序算法。
- 其思想是: - 在未排序的序列中选择最小(大)的元素,把它放在序列的起始位置上。 - 然后再从剩余未排序的序列中继续选择小(大)的元素,放在已排序的末尾。 - 以此类推,直到全部待排序的数据元素排完。
选择排序的优点
- 选择排序的实现思路简单,易于理解和实现。
- 选择排序不需要占用额外的空间,节省资源,是一种原地排序的算法。
选择排序的适用场景
-
选择排序的思路简单,尽管它的时间复杂度相较于更优的算法来讲不占优势,但对一些数据规模少的数据集,使用选择排序会很简单,节省时间,提高效率,所以对于选择排序适用于数据类较小的情况。
-
由于选择排序的时间复杂度较高,对于数据量大的数据集,效率会非常低,所以不适合用于大规模的数据排序。
选择排序的实际应用场景
以下是选择排序的几个应用场景:
- 部分有序数组:如果输入的数组已经部分有序,只有少量元素需要排序,那么此时可以使用选择排序的算法,因为交换次数相对较少,效率会相对提高一些。
- 内存受限系统:选择排序是一种原地排序算法,不需要额外的空间存储排序结果,所以在内存受限的一些系统中有一定的应用价值。
选择排序的实现思路
-
遍历待排序数组,找出数组的最小值,记录其索引值,为之后的比较交换做准备。
2. 在剩余的未排序序列中寻找最小值,并将其与已找的最小值进行交换,添加到数组末尾。# 找出数组的最小值 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
smallest = findSmallest(arr) newArr.append(arr.pop(smallest))
-
重复步骤 2,直到未排序序列为空,整体代码实现如下。
# 寻找最小值 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
选择排序的复杂度分析
时间复杂度
# 寻找最小值
def findSmallest(arr):
for i in range(1, len(arr)):
...
return smallest_index
# 循环遍历交换元素
def selectionSort(arr):
for i in range(len(arr)):
...
return newArr
- 选择排序的第一步是需要遍历整个数组,找出一个最小或最大值,所以第一层的循环时间复杂度为O(n)。
- 之后在未排序的列表中继续循环,把剩余元素与已选定的最大或最小值进行比较,第二层的循环还是O(n)。
- 根据嵌套相乘的计算方式,选择排序时间复杂度即为O(n^2^)。
空间复杂度
选择排序只需传入的数组参数,所以空间复杂度为O(1)。