Select Sort

Select Sort

主要思路:将列表分为有序区与无序区;与冒泡排序一样,每一趟都会选出一个数放入有序区,所以会有n-1趟(n为列表长度);从无序区中找最小值,将其与无序区的第一个数交换位置,则第一个数所在位置划为有序区,以此类推,无序区一直缩减,直到第n-1趟,无序区只剩一个数,这个数即为最大值,不用排

def Select_sort(list):
    for i in range(len(list)-1): # 趟数
        min_loc = i    # 无序区中最小值的下标,假定第一个是最小值
        for j in range(i+1,len(list)): # 在无序区中遍历
            if list[j] < list[min_loc]: # 如果无序区中有比假定值小
                min_loc = j  # 更新最小值下标
        list[i],list[min_loc] = list[min_loc],list[i]
    return list
------------------------------------------------
list3 = [9,4,3,7,6,1,8,2,5]
print(Select_sort(list3))------->[1, 2, 3, 4, 5, 6, 7, 8, 9]
  1. 在无序区中,假定第一个元素为最小值,我们设定min_loc来记录最小值的下标
  2. 每一趟都是从无序区的第一个开始遍历,而且每一趟都选择出一个数放入有序区,所以第 i 趟就代表无序区从第 i 个开始
  3. 因为无序区第一个为假定最小值,所以需要与下一个比较,因此内层循环的开始需要在 i+1 处开始
  4. 内层循环中,遍历无序区,遇到比假定值小的就更新min_loc的值,因为:并不是每次遇到的都是最小的,更新下标,相当于记住了此时的值的位置,为了方便后续遍历完毕后,与无序区第一个元素交换位置
  5. 时间复杂度:O(n的平方)

这时可能就有人说了,python不是有一些方法可以直接找到最小值吗?

像这样:

def select_sort_simple(list):
    list1 = []
    for i in range(len(list)):
        list1.append(min(list))
        list1.remove(min(list))
    return list1
------------------------------------------
list3 = [9,4,1,7,6,3,8,2,5]
print(select_sort_simple(list3))----->[1,2,3,4,5,6,7,8,9]

看着很简便,但是,这里的min()、remove()方法都是时间复杂度为O(n)的

整体上看,时间复杂度为O(n的平方),但是相较于上面的算法,这里的时间复杂度是要大得多的,而且空间复杂度也大了 ,因为需要开辟一个新列表来装入排好的数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值