今天给大家分享的是 Python 算法中的选择排序。选择排序是一种简单直观的排序算法。和之前讲到的冒泡排序、快速排序性质一样,都是属于比较法排序。
排序原理
它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
排序思路
选择排序是给每个位置选择当前元素最小的,比如给第一个位置选择最小的,在剩余元素里面给第二个元素选择第二小的,依次类推,直到第 n-1 个元素,第 n 个元素不用选择了,因为只剩下它一个最大的元素了。
为了便于理解,例子中的列表我只用了 4 个元素,利用双层 for 循环完成排序,内层 for 循环做判断和基准数字比较大小,比基准数字小的就交换位置,直到选择出最小的放在第一位,然后再从剩下的数字中继续判断,选择出第二小的,以此类推。(左右滑动查看全部代码)
Python
def selection_sort(list):
for i in range(0, len(list)-1):
min_ = i
for j in range(i + 1, len(list)):
if list[j] < list[min_]:
min_ = j
list[i], list[min_] = list[min_], list[i] # 双方交换位置
print(list)
list = [8, 4, 11, 6]
selection_sort(list)
1
2
3
4
5
6
7
8
9
10
11
12
defselection_sort(list):
foriinrange(0,len(list)-1):
min_=i
forjinrange(i+1,len(list)):
iflist[j]<list[min_]:
min_=j
list[i],list[min_]=list[min_],list[i]# 双方交换位置
print(list)
list=[8,4,11,6]
selection_sort(list)
代码分析
为了便于理解,我在代码中把每次内外层循环时的列表打印出来。(左右滑动查看全部代码)
Python
def selection_sort(list):
for i in range(0, len(list)-1):
min_ = i
print(list)
for j in range(i + 1, len(list)):
if list[j] < list[min_]:
min_ = j
list[i], list[min_] = list[min_], list[i] # swap
print(list)
print(" ")
list = [8, 4, 11, 6]
selection_sort(list)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
defselection_sort(list):
foriinrange(0,len(list)-1):
min_=i
print(list)
forjinrange(i+1,len(list)):
iflist[j]<list[min_]:
min_=j
list[i],list[min_]=list[min_],list[i]# swap
print(list)
print(" ")
list=[8,4,11,6]
selection_sort(list)
打印出来的结果如下
Python
[8, 4, 11, 6]
[4, 8, 11, 6]
[4, 8, 11, 6]
[4, 6, 11, 8]
[4, 6, 11, 8]
[4, 6, 8, 11]
1
2
3
4
5
6
7
8
9
10
[8,4,11,6]
[4,8,11,6]
[4,8,11,6]
[4,6,11,8]
[4,6,11,8]
[4,6,8,11]
从第一组数可以看出,i 经过第一轮的循环后,把列表中最小的数字 4 提取了出来并和之前的第一位的数字 8 交换了位置。第一个最小的数字排好序后,接下来 i 继续往后循环,在后面三个数中最小的 6 交换到第二位。i 第三次循环时比较最后两个数字的大小,把相对小的排在第三位,最后一位不用排,自然就是最大的数字了。
以上的例子是把数字从小到大升序排列,如果需要从大到小降序排列呢?只需要把代码中 if 判断语句中的 < 符号改成 > 符号即可。
今天的 Python 算法选择排序比较简单,希望能帮助大家更好地理解。