python选择排序

嘻嘻我按照步骤来一步步讲解选择排序

第一步,是从第一个元素到最后一个元素中选择一个最小的元素

第二步,将选择的最小元素和列表中第一个元素交换,此时第一个元素是列表中元素最小的

第三步,从列表中第二个元素到最后一个元素开始选择其中最小的元素,此时选的元素是列表中第二小。

第四步,将第二小元素和列表中第二个元素进行交换。

以此类推,重复上列操作,每次选择一个最小的元素,这也是选择排序的由来

def selection_sort(arr):
    n = len(arr)
    for i in range(n):
        min_idx = i
        for j in range(i+1, n):
            if arr[j] < arr[min_idx]:
                min_idx = j
        arr[i], arr[min_idx] = arr[min_idx], arr[i]
        print(arr)#为明确选择排序的过程,每个步骤进行打印
        return arr
a =[2,3,5,6,1,-1,7,9]#例子
selection_sort(a)

 结果:

当然我们也可以看看选择排序数字移动的过程

没有 return arr就可以得到选择排列的过程

def selection_sort(arr):
    n = len(arr)
    for i in range(n):
        min_idx = i
        for j in range(i+1, n):
            if arr[j] < arr[min_idx]:
                min_idx = j
        arr[i], arr[min_idx] = arr[min_idx], arr[i]
        print(arr)#为明确选择排序的过程,每个步骤进行打印
        #return arr
a =[2,3,5,6,1,-1,7,9]#例子
selection_sort(a)

改进

当然在以上算法有一个小瑕疵,在选择排序中,第一次循环中确实找到了最小元素,而且这个元素会在列表的开头。因此,在第一次迭代时有时可以不比较它,所以代码中可以改成

def selection_sort(arr):
    n = len(arr)
    for i in range(n-1):#在选择排序中,第一次循环中确实找到了最小元素,而且这个元素会在列表的开头。因此,在第一次迭代时有时可以不比较它
        min_idx = i
        for j in range(i+1, n):
            if arr[j] < arr[min_idx]:
                min_idx = j
        arr[i], arr[min_idx] = arr[min_idx], arr[i]
        print(arr)#为明确选择排序的过程,每个步骤进行打印
        #return arr
a =[2,3,5,6,1,-1,7,9]#例子
selection_sort(a)

 这样我们得到的过程中就更简洁:之前8次过程,现在7次,可以说之前的代码是已经完成了选择又多选择了一次

 

选择排序的时间复杂度为O(n^2)

其中n是待排序的元素数量。具体来说,选择排序包含两层循环。外层循环需要遍历包含n个元素的列表,而内层循环需要遍历包含剩下n-1个元素的子列表。因此,总共要执行n(n-1)/2次比较操作和n次的交换操作。这使得选择排序在最坏和平均情况下都具有相同的时间复杂度。

选择排序的空间复杂度为O(1)

因为选择排序使用常数个额外的变量来存储待排序列表的当前最小值和已排序列表的末尾,并且它不需要额外的列表或数组来完成排序。这使得它比某些其他排序算法更加节省存储空间。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超级鲁滨逊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值