博主一头小山猪
目前已开放文章如下:
一文学懂经典算法系列之:顺序查找(附讲解视频)
活动地址:CSDN21天学习挑战赛
对于直接选择排序的数组,该数组大概率是无序的,若该数组是有序的(且该数组是用户的目标顺序),那么就不用通过算法来进行排序了。
直接选择排序的定义
通过比较最小值,得到每一个循环中的最小值的索引,并得到对应值后,将其与循环后的次位交换。
直接选择排序的工作方式
在原数组中选出序列中最小元素放在首位,依次从剩下的数组元素中选出最小元素放于次位,直至所有元素都选择完毕,排序结束。
伪代码
Straight_Select
(
A
)
:
(A):
(A):
1 for i = 1 to n - 1
2 k = i
3 for j = i + 1 to n
4 if A[j] < A[k]
5 k = j
6 if k != i
7 exchange A[i] with A[k]
伪代码解析
对于直接选择排序,本文将其伪代码过程命名为Straight_Select_Sorting,其中的参数是一个数组 A [ 1... n ] A[1...n] A[1...n],包含长度为 n n n的要排序的一个序列。在Python代码中, A A A中元素的数目 l e n ( A ) len(A) len(A)来表示。该算法原址排序输入的数之后,算法在数组 A A A中重排这些数,在任何时候,最多只有其中的常数个数字存储在数组外面。在过程Straight_Select结束时,输出数组 A A A包含排序好的输出序列。
对于直接选择排序的个人理解
假设数组
A
A
A中有
n
n
n个元素,采用
m
i
n
(
)
min()
min()函数在数组
A
A
A找到最小的一个数,取出后与排序为首位的数字交换。那么此时原数组变为
[
m
i
n
,
n
−
1
的数组
]
[min,n-1的数组]
[min,n−1的数组],我们暂且不管原先排首位的数字去了哪里。称右侧的
[
n
−
1
的数组
]
[n-1的数组]
[n−1的数组]为数组1,对右侧的
[
n
−
1
]
[n-1]
[n−1]的数组即数组
1
1
1再次进行上一步的操作,即采用
m
i
n
(
)
min()
min()函数在数组
1
1
1里找到最小的一个数,取出后与排序为首位的数字交换。注意,此时的数组
1
1
1的首位是原数组的次位。如此往复循环,最终都将最小的一个数按次序排列下去。
对于直接选择排序的代码实现,有两种方式可以实现,第一种在【21天学习经典算法】插入排序(附Python完整代码)
中Python代码实现插入排序的空数组排序已经实现,因此本文只讲述在原数组
A
A
A中实现直接选择的排序的代码过程。
沿用之前创建的数组
A
=
[
41
,
54
,
95
,
32
,
11
,
5
,
7
,
10
,
21
,
9
,
85
,
12
,
13
,
15
,
64
,
84
]
A = [41, 54, 95, 32, 11, 5, 7, 10, 21, 9, 85, 12, 13, 15, 64, 84]
A=[41,54,95,32,11,5,7,10,21,9,85,12,13,15,64,84]
A = [41, 54, 95, 32, 11, 5, 7, 10, 21, 9, 85, 12, 13, 15, 64, 84]
for i in range(len(A)):
# a是原数组的首位,b是不断缩小的数组中的最小值,c是不断缩小的数组中的最小值的索引值
a, b, c = A[i], min(A[i:len(A)]), A.index(min(A[i:len(A)]))
# 将原数组的首位数字与原数组的最小值进行交换
A[i], A[c] = b, a
print(A)
以上就是个人在直接选择排序中的理解,如果错误之处,还望指正。