python实现排序算法——选择排序

       使用python实现选择排序算法。


算法步骤:

Step 1: 选择目前尚未排序的序列的首位序号,将其依次和后面的数字比较,选出后面序列的最小序号,并将最小序号和之前记录的首位序号调换位置。这样可以将最小的数字排在最前面
Step 2: 将step 1循环执行 ( n − 1 ) (n-1) (n1)次, 不断的选择当前未排序的序列的最小值,放在当前为排序序列的最前面。


算法举例:

对序列【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) (n1)次,内层循环 ( n − i − 1 ) (n−i−1) (ni1)次,所以它的时间复杂度是 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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值