Python实现把列表里的数字按从小到大的顺序排列

一、自己造轮子

第一种方式的思路:

拿出列表里的第0个元素,把它赋给一个叫做“最小值”的变量,然后用这个变量去跟后面的每个数字一一对比,如果碰到比它小的,就把那个新发现的小数字赋给“最小值”变量,否则维持原状。

这样一轮下来,就能找到当前这些数字里的最小值,也就是应该在升序的列表中排在队首的元素。而这一轮当中,我们进行了“”元素总个数-1”次比较。紧接着,把这个最小的元素从原列表中删除。再用同样的方法,找出剩下的数字里最小的。

列表里一共有10个数字的话,上述过程就应该重复9次。因为只剩下一个元素的时候就不需要比较了,它自然是最大的,排在队尾。

这种排序方法叫做“选择排序”。算法的复杂度是O(n²)。

lst=[2,56,4,9,17,30,7,8,24,1]
order=[]

for j in range(10,1,-1):
#j代表列表里当前的元素个数
    smallest=lst[0]
    for i in range(1,j):
    #i代表元素的索引,也就是拿第0个元素和列表里的第1个比较,第2个比较,一直比到第j-1个,完成一轮
        if smallest<=lst[i]:
            pass
        else:
            smallest=lst[i]

    lst.remove(smallest)
    #从原列表中移除已经确认的当前最小元素
    order.append(smallest)
    #把这个当前最小元素追加到升序列表中
order.append(lst[0])
#列表里最后剩下的那个元素追加到队尾
print(order)  

第二种方式的思路:

我们从列表中找到一个数字作为基准,然后去查看其它数字,比它小的放到一个新列表里,并把这个新列表放到基准数字的左边,比它大的数字放到另外一个列表里,并把这个装满大数字的列表放到基准数字的右边。一种非常理想的情况是,小数字列表里的元素本身就已经按照升序排好了,大数字列表里的元素也本身就按照升序排好了,那我们只要把小数字列表、基准数字、大数字列表拼接到一起就完成了全部数字的排序。而这个理想情况也是需要我们自己去实现的。我们要不断重复找基准数字、把其他数字分为小数字阵营和大数字阵营的工作,直到什么时候结束呢?直到最后切分出来的小数字/大数字列表里只有一个元素或一个元素都没有就可以停止了。

现在我们有了基线条件,还有了需要不断重复的工作。一个词呼之欲出——递归!

其实这种排序方式就是“快速排序”。算法的复杂度是O(n log n)

def quicksort(arr):
    '''快速排序函数'''
    if len(arr)<2:
        return arr
        #上面是描述基线条件的部分,当列表里的元素不足两个时,直接原样返回
    else:
        pivot=arr[0]
        #把列表开头的元素当做基准数字
        less=[]
        greater=[]
        #上面创建了用于存放小于基准数字和大于基准数字的元素的空列表
        for i in arr[1:]:
            if i<=pivot:
                less.append(i)
            else:
                greater.append(i)
                #上面是遍历列表里除掉基准数字以外的数字,按照我们的规定分别存放到两个列表里
        return quicksort(less)+[pivot]+quicksort(greater)
        #返回的就是我们需要的顺序,这里记得要把基准数字放到一个单独的列表里,否则拼接会失败

print(quicksort([23,9,55,33,24,15]))
#随便找个无序列表试一试我们的函数好不好用
    

二、用前人造好的轮子

lst=[2,56,4,9,17,30,7,8,24,1]
lst.sort()
#sort是列表的一个方法,默认会把列表里的数字按照升序排列
print(lst)

*********************************************************************************************************************

如果这篇博文帮到了你,就请给我点个吧(#^.^#)

有疑问也欢迎留言~博主可nice啦,在线秒回ヾ(◍°∇°◍)ノ゙

评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值