使用python实现选择排序算法。
算法步骤:
Step 1: 选择目前尚未排序的序列的首位序号,将其依次和后面的数字比较,选出后面序列的最小序号,并将最小序号和之前记录的首位序号调换位置。这样可以将最小的数字排在最前面
Step 2: 将step 1循环执行
(
n
−
1
)
(n-1)
(n−1)次, 不断的选择当前未排序的序列的最小值,放在当前为排序序列的最前面。
算法举例:
对序列【3,2,1,5,4】排序
第一层循环: 比较4次,本次未排序序列的首位序号为0(首位)
比较【3,2】:最小值序号为1
比较【2,1】:最小值序号为2
比较【1,5】:最小值序号为2
比较【1,4】:最小值序号为2
此时,最小值序号的数字2和未排序序列的首位序号0调换顺序,即【1,2,3,5,4】
第二层循环: 比较3次,本次未排序序列的首位序号为1
比较【2,3】:最小值序号为1
比较【2,5】:最小值序号为1
比较【2,4】:最小值序号为1
此时,最小值序号和未排列序列首位序号相同,序列不变,即【1,2,3,5,4】
第三层循环: 比较2次,本次未排序序列的首位序号为2
比较【3,5】:最小值序号为2
比较【3,4】:最小值序号为2
此时,最小值序号和未排列序列首位序号相同,序列不变,即【1,2,3,5,4】
第四层循环: 比较1次,本次未排序序列的首位序号为3
比较【5,4】:最小值序号为4
此时,调换最小值序号4和未排列的首位序号5,即【1,2,3,4,5】
算法评价:
我们可以发现,选择排序方法是不需要额外的空间的。所以它的空间复杂度是 O ( 1 ) O(1) O(1) 。但是选择排序法的效率比较低,它需要外层循环 ( n − 1 ) (n−1) (n−1)次,内层循环 ( n − i − 1 ) (n−i−1) (n−i−1)次,所以它的时间复杂度是 O ( n 2 ) O(n2) O(n2)。并且选择排序法是稳定的 。
方法 | 平均时间复杂度 | 最坏时间复杂度 | 最好时间复杂度 | 空间复杂度 |
---|---|---|---|---|
选择排序法 | O ( n 2 ) O(n^2) O(n2) | O ( n 2 ) O(n^2) O(n2) | O ( n 2 ) O(n^2) O(n2) | O ( 1 ) O(1) O(1) |
python实现:
########################################################
##### 选择排序 #####
########################################################
def xuanze(nums, order=1):
for i in range(len(nums)-1):
#tmp表示记录最小值的序号,初始状态是为排序序列的首位
tmp = i
for j in range(i+1,len(nums)):
if nums[j]<nums[tmp]:
#找到未排序序列的最小值序号
tmp = j
#如果最小值序号不等于初始序列序号,那么交换二者的位置,保证最小值在最前面
if tmp != i:
nums[i],nums[tmp] = nums[tmp],nums[i]
#我们默认是从小到大排列,如果order不等于1,我们从大到小排列
if order == 1:
return nums
else:
return nums[::-1]
In [3]: xuanze([12,1,34,14,56,23,14,6,7,8,0,43,76])
Out[3]: [0, 1, 6, 7, 8, 12, 14, 14, 23, 34, 43, 56, 76]
In [4]: xuanze([12,1,34,14,56,23,14,6,7,8,0,43,76],1)
Out[4]: [0, 1, 6, 7, 8, 12, 14, 14, 23, 34, 43, 56, 76]
In [5]: xuanze([12,1,34,14,56,23,14,6,7,8,0,43,76],0)
Out[5]: [76, 56, 43, 34, 23, 14, 14, 12, 8, 7, 6, 1, 0]