排序算法:
排序算法是一类用于将一组数据(如数字、字符串或其他可比较对象)按照特定顺序进行排列的算法。这种顺序可能是递增(从小到大)、递减(从大到小)或其他用户定义的准则。
选择排序是一种简单的排序算法下面是选择排序的算法原理:
-
初始化:
- 首先,选择排序针对的是一个无序的数组(或列表)。
A = [5, 2, 8, 1, 9] # 长度是 n - 1
-
遍历过程:
假定第一个元素即为最小值
for i in range(1,A_arr): # min_index = i # 从新列表中第二个元素下标开始遍历,因为第一个元素是空值
-
查找最小/最大值:
将原来列表中第一个元素与当前未排序部分的元素进行比较,并将最小值赋给接受最小值元素下标的变量 min_index(在这个例子中,是第一个元素之后的所有元素)
for j in range(i+1,A_arr+1): # 获取从第三个元素下标开始遍历,因为新添加了一个元素,所以所有的元素下标都后移一位 if A_zero_start[j] < A_zero_start[min_index]: min_index = j
-
交换元素位置:
如果找到比当前已认为是最小值的元素还小的数,则更新这个最小值的位置。
A_zero_start[min_index], A_zero_start[i] = A_zero_start[i], A_zero_start[min_index]
互相交换,最小的元素去到接受最小元素位置那里,不是最小的会两者较大一方的位置。
-
重复上述步骤:
- 之后,算法继续处理剩余未排序的部分(即除了已经排序好的元素之外的所有元素)。
这就需要两个for循环:
for i in range(1, n + 1): # 遍历1-5 8 min_index = i # 用来表示当前最小的元素下标 9 10 for j in range(i + 1, n + 1): #遍历 2-5 # 只有在除去第一个元素之后的所元素中找到比第一个元素小就进入循环,如果没有找到就继续遍历直到完成所有列表中的元素 11 if A_zero_start[j] < A_zero_start[min_index]: #遍历第一个元素之后的所有元素和 第一个元素比较 12 min_index = j # 将当前最小的元素的下标赋值给接受最小元素下标的位置。 # 什么时候结束内层的循环,将列表中的除去第一个元素之后的所有元素和第一个元素进行比较,找到最小的元素就好了。 用代码解释就是: [4,6,2,3,1] [4] [6] # 4 和 6 比较 [4] # 4最小,留下来 [4] [2] # 4 和 除去第一个元素后的所有元素中第二个 ,也就是元素2进行比较 [2] # 2 最小 [2] [3] [2] [2] [1] [1] # 直到找到最小的。
-
终止条件:
- 这个过程会一直持续下去,直到所有元素都被挑选过一遍并放置在正确的位置上,即整个序列变得有序为止。
附录源代码:
# 选择排序
A = [5, 2, 8, 1, 9] # 长度是 n - 1
# 获取列表的长度
A_arr = len(A)
# 添加一个占位符
A_zero_start = [None] + A
print(A_arr)
for i in range(1,A_arr): #
min_index = i # 获取新列表中第二个元素下标因为第一个元素是空值
for j in range(i+1,A_arr+1): # 获取从第三个元素下标开始遍历,因为新添加了一个元素,所以所有的元素下标都后移一位
if A_zero_start[j] < A_zero_start[min_index]:
min_index = j
if min_index != i:
A_zero_start[min_index], A_zero_start[i] = A_zero_start[i], A_zero_start[min_index]
A_zero_start = A_zero_start[1:]
print(A_zero_start)
解释中一个疑惑店:
A_zero_start = [None] + A 具体在这段代码中体现什么作用?
在这段代码中,
A_zero_start = [None] + A
的作用是创建一个新的列表,其中在原始列表A
的前面添加了一个None
元素。这样做是为了模拟索引从1开始的场景,并确保在后续的排序过程中不会误操作到不存在的元素(因为在实际的Python列表中,索引是从0开始的)。
None
是 Python 中的一个特殊类型,表示空值或者没有值的概念,在这里作为列表的第一个元素,但它不参与排序。
+
运算符用于连接两个列表,形成一个新的列表。原列表A
中的所有元素都向右移动一位,新列表的第一个位置由None
占据。
if min_index != i: 这个假设在什么情况下满足?
在选择排序的过程中,
if min_index != i:
这个条件判断语句用于检查在当前轮次(以索引i标识)中找到的最小值是否位于索引i本身的位置。
- 当初始化
min_index
时,将其设置为当前轮次的起始索引i
。- 然后,通过内层循环遍历从
i+1
开始到列表末尾的所有元素,寻找比当前min_index
处元素更小的元素。- 如果找到了更小的元素,就更新
min_index
为找到的这个较小元素的索引。当循环结束时,
min_index
应该指向了从i+1
开始到列表末尾的范围内最小的元素的索引。如果这个最小元素恰好位于初始索引i
处,即待排序部分的第一个元素已经是当前未排序部分的最小值,那么min_index
仍等于i
。比如:2 和 [5,4,6,3] 在进行比较,比了半天2还是里面最小的,所以我们就不需要执行更换相对位置的代码
然而,若在内层循环中找到了一个比
A_zero_start[i]
更小的元素,min_index
就会被更新为这个更小元素的索引,此时min_index
就不再等于i
了。满足条件
if min_index != i:
的情况就是在当前轮次中,找到了一个应当排在索引i
位置之前的元素。这种情况下,我们会执行元素交换操作,将A_zero_start[min_index]
和A_zero_start[i]
的值互换,以保证原地排序的效果。
"细微之处见真章,小事不成,何以显现致密之工。"
这是我对自己的一点期望,望大家共勉