目录
选择排序
基本思想
性能特点
步骤详解
python代码
选择排序
选择排序是一种十分基础的的排序算法,比较简单直观。当对数据量较少的序列实现升序或降序排序是可以采用选择排序。
基本思想
从头到尾扫描所有的n个元素,从中找出最小或最大的元素并和第一个元素进行交换,然后从除第一个以外的n-1个元素中扫描,找出最小或最大的元素并和第一个(n-1个中)元素进行交换,不断迭代此操作剩下的元素,最终就是一个有序的序列。
性能特点
平均时间复杂度 | 最好情况 | 最坏情况 | 空间复杂度 | 排序方式 | 稳定性 |
In-place | 不稳定 |
步骤详解
待排序列:1,42,65,876,34,656,4
1 | 42 | 65 | 876 | 34 | 656 | 4 |
升序排序
第一趟排序:待排序列中1为最小元素,且1本来就在最小元素位置,则不发生元素交换。
已经有序{},剩下待排序序列{1,42,65,876,34,656,4}
min | |||||||
扫描 | 1 | 42 | 65 | 876 | 34 | 656 | 4 |
排序 | 1 | 42 | 65 | 876 | 34 | 656 | 4 |
第二趟排序:剩下待排序列中4为最小元素,则把4交换到最小元素位置上。
已经有序{1},剩下待排序序列{42,65,876,34,656,4}
min | |||||||
扫描 | 1 | 42 | 65 | 876 | 34 | 656 | 4 |
排序 | 1 | 4 | 65 | 876 | 34 | 656 | 42 |
第三趟排序:剩下待排序列中34为最小元素,则把34交换到最小元素位置上。
已经有序{1,4},剩下待排序序列{65,876,34,656,42}
min | |||||||
扫描 | 1 | 4 | 65 | 876 | 34 | 656 | 42 |
排序 | 1 | 4 | 34 | 876 | 65 | 656 | 42 |
第四趟排序:剩下待排序列中42为最小元素,则把42交换到最小元素位置上。
已经有序{1,4,34},剩下待排序序列{876,65,656,42}
min | |||||||
扫描 | 1 | 4 | 34 | 876 | 65 | 656 | 42 |
排序 | 1 | 4 | 34 | 42 | 65 | 656 | 876 |
第五趟排序:剩下待排序列中65为最小元素,且65本来就在最小元素位置,则不发生元素交换。
已经有序{1,4,34,42},剩下待排序序列{65,656,876}
min | |||||||
扫描 | 1 | 4 | 34 | 42 | 65 | 656 | 876 |
排序 | 1 | 4 | 34 | 42 | 65 | 656 | 876 |
第六趟排序:剩下待排序列中656为最小元素,且656本来就在最小元素位置,则不发生元素交换。已经有序{1,4,34,42,65},剩下待排序序列{656,876}
min | |||||||
扫描 | 1 | 4 | 34 | 42 | 65 | 656 | 876 |
排序 | 1 | 4 | 34 | 42 | 65 | 656 | 876 |
有序序列:待排元素只剩下一个,则整个序列已经是有序序列了。
已经有序{1,4,34,42,65,656},剩下待排序序列{876},此时整个序列已经有序{1,4,34,42,65,656,876}
1 | 4 | 34 | 42 | 65 | 656 | 876 |
python代码
升序
# 选择排序
def selectionSort(arr):
for i in range(len(arr) - 1):
minIndex = i # 记录最小元素的索引
# 找出最小元素
for j in range(i + 1, len(arr)):
if arr[j] < arr[minIndex]:
minIndex = j
# i不是最小元素时,将i和最小元素进行交换
if i != minIndex:
arr[i], arr[minIndex] = arr[minIndex], arr[i]
return arr
if __name__=="__main__":
nums = [1, 42, 65, 876, 34, 656, 4, 6757, 89, 24, 65, 42]
print("start:", nums)
print("冒泡 :", selectionSort(nums))
降序
# 选择排序
def selectionSort(arr):
for i in range(len(arr) - 1):
maxIndex = i # 记录最大元素的索引
# 找出最大元素
for j in range(i + 1, len(arr)):
if arr[j] > arr[maxIndex]:
maxIndex= j
# i不是最大元素时,将i和最大元素进行交换
if i != maxIndex:
arr[i], arr[maxIndex] = arr[maxIndex], arr[i]
return arr
if __name__=="__main__":
nums = [1, 42, 65, 876, 34, 656, 4, 6757, 89, 24, 65, 42]
print("start:", nums)
print("冒泡 :", selectionSort(nums))