选择排序的工作原理简单直观,和冒泡排序也有异曲同工之处,它将需要排序的数组分为有序区和无序区,首先在无序区选出最小的数,放到有序区的末尾(有序区为从小到大排序好的数组,因此此时从无序区选出的最小的数一定大于有序区中最大的数),以此类推,直到数组有序。
算法描述
- 初始状态:无序区为原始数组 a r r [ 1 , . . . , n ] arr[1,...,n ] arr[1,...,n],有序区为空;
- 第 i ( i = 0 , 1 , . . . , l e n ( a r r ) − 1 ) i(i=0, 1, ..., len(arr)-1) i(i=0,1,...,len(arr)−1)次排序开始,当前的有序区为 a r r [ 1 , . . , i ] arr[1, .., i] arr[1,..,i],无序区为 a r r [ i + 1 , . . , n ] arr[i+1, .., n] arr[i+1,..,n],然后在无序区选出最小的数,放到有序区的末尾(有序区为从小到大排序好的数组,因此此时从无序区选出的最小的数一定大于有序区中最大的数,所以放在有序区的末尾)
- 重复上述步骤,直到排序结束。
时间复杂度 (平均) | 时间复杂度(最坏) | 时间复杂度(最好) | 空间复杂度 | 稳定性 |
---|---|---|---|---|
O ( n 2 ) O(n^2) O(n2) | O ( n 2 ) O(n^2) O(n2) | O ( n 2 ) O(n^2) O(n2) | O ( 1 ) O(1) O(1) | 稳定 |
代码描述
同冒泡排序类似,选择排序也包含两层循环,一层是在无序区中找到最小的数,一层是除了已经排好的较小的数(有序区)之外,重复比较排序,比较过程如下图所示(图比较粗糙,见谅~~):
拿图中第三行来举例,[4, 5, 10]被认为是有序区,[7, 8]为无序区,从无序区中找到了最小数7,放入到有序区的末尾,后来的步骤以此类推。
不多说了,python实现的代码如下:
def selection_sort(arr):
if len(arr) == 0 or arr is None:
return None
for i in range(len(arr)-1): # 只需要 lne(arr)-1 次选择排序
minIndx = i
for j in range(i+1, len(arr)):
if arr[j] < arr[minIndx]:
minIndx = j
arr[i], arr[minIndx] = arr[minIndx], arr[i]
return arr
if __name__ == '__main__':
arr = [54, 26, 93, 17, 77, 31, 44, 55, 20]
print(selection_sort(arr))