先上动图。橘色代表已经完成排序的数字,红色记录的是本轮循环最小值的索引,绿色表示红色与绿色进行比较。
选择排序的核心:不停的比较两个数,找出最小值,然后把找出的最小值想办法放在数组前面。
基本思路:
1,假设第一个数最小,然后拿这个数与后面的数依次比较,如果发现更小的数,则立即记录更小的数的索引。一轮循环完成之后,如果索引变化,则利用索引将找到的最小值换到第一个位置。
2,经过上一轮的操作,最小的数已经出现在第一个位置,现在假设第二个位置的数最小,然后再剩下的数中再找出最小的数放在第二个位置。
3,假设第三个数最小,……
4,经过n-1轮循环,数组最后那个数天然的为最大值。排序完成。
目录
答:若n为排序数字的个数,则需要n-1轮。理由:假设有n个数,则需要找n-1个当前轮的最小值放在数组前面,此时数组最后面的那个数天然为最大值(都找了n-1次最小值了,剩下的那个自然是最大的)。
假设一个位置的数为最小值,然后把这个数与后面的数依次进行比较,就可能会发现比假设数更小的数。
每轮循环中,一旦发现比假设值更小的值,则立即就更小值的索引,本轮循环完成之后将最小值换道假设值的位置。
答:(n-当前轮数)次。假设7个数循环第一轮,第一次需要比较7-1=6次。
- import random
-
-
- def select_sort(arr):
- arr_length = len(arr) # 获取列表长度
- circle_num = 0 # 一开始第一轮假设arr[0]的值最小,故设置circle_num=0。
- # 第二轮的时候假设arr[1]最小,故外层第一次循环结束前需要circle_num += 1
- min_index = circle_num # min_index记录最小值的索引
- while circle_num < arr_length - 1:
- index = circle_num + 1 # index从当前轮数的下一个数开始
- while index < arr_length: # 排序核心,比较两个数的大小,下标从circle_num + 1开始一直比较到列表最后一个元素
- if arr[index] <= arr[min_index]:
- min_index = index # 记录最小那个数的索引
- index += 1
- if min_index != circle_num: # 如果发现比假设值更小的数,则根据记录的索引交换两个数
- arr[circle_num], arr[min_index] = arr[min_index], arr[circle_num]
- circle_num += 1 # +1进入下一轮
-
-
- if __name__ == '__main__':
- arr_test = [int(random.random() * 100) for i in range(10)]
- print('排序之前的列表:')
- print(arr_test)
- select_sort(arr_test)
- print('排序之后的列表:')
- print(arr_test)
-