A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Gczy 初级黑马   /  2018-6-1 01:52  /  1513 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

第5天的时候, 老师出了一道作业
对任意列表从小到大排序*(不准使用sort排序)

然后还给了个冒泡排序的动画提示, 但是我想了半天也没想清楚怎么写, 决定先写出来, 然后再改, 我的想法很简单, 就是一般人要排序时的第一反应: 先找最大值, 放最后, 然后找第二大的, 放倒数第二, 最后写成了这样
[Python] 纯文本查看 复制代码
ex_list=[1,4,3,97,68,72,29,51,45]


def maximum(nex_list):
    i = 0
    max_num = nex_list[0]
    while i<len(nex_list)-1:
        if len(nex_list) == 1:
            return max_num
        elif max_num< nex_list[i+1]:
            max_num = nex_list[i + 1]
        i += 1
    return max_num

a = []
i = 0
b= len(ex_list)-1
while i <= b:
    a.insert(0,maximum(ex_list))
    ex_list.remove(maximum(ex_list))
    i+=1

print(a)


本来以为那么土的方法肯定上不了台面, 回去一查, 结果发现, 竟然也算一种算法, 叫选择排序算法,  并且效率似乎也是和冒泡排序差不多的, 然后过了这么多天, 学了很多新知识,
之前写得很差的可以重新改写一下, 毕竟题目是要给列表排序, 而我则直接另建了个列表, 严格来说还是没回答上

比如用for遍历来改写:
[Python] 纯文本查看 复制代码
def s_sort(list1):
    for i in range(len(list1)):
        x = i  
        for j in range(i, len(list1)):
            if list1[j] < list1[x]:
                x = j
        list1[i], list1[x] = list1[x], list1[i]
    return list1

ex_list=[1,4,3,97,68,72,29,51,45]

print(s_sort(ex_list))


上面的写法是用上了for遍历, 将之前取最大值放最后改成了取最小值放最前,  第三行x = i 用来依次记录最小值, 这样第一次大循环最小的被找出放置在最前, 第二次大循环在剩下未排序列表中依然找出最小值, 也就是整个列表的第二小值, 放置在第二个位置, 以此类推, 完成排序, 这样写就是修改原来的列表而不是重新生成一个列表了

如果用while循环来写的话, 取最大值来排序写起来会比for遍历方便很多, 就像这样
[Python] 纯文本查看 复制代码
def s_sort(list1):
    i = len(list1)-1
    while i>0:
        x= i
        j = 0
        while j<=i:
            if list1[j] > list1[x]:
                x = j
            j +=1
        list1[x],list1[i] = list1[i],list1[x]
        i-=1
    return list1

ex_list=[1,4,3,97,68,72,29,51,45]
print(s_sort(ex_list))


大体上和for遍历差不多, 也是每次循环找出未排序列表中的最大值然后和后面的位置进行交换

感觉简单的排序也挺有意思的, 已经等不及学更多新知识学会更多算法了


1 个回复

正序浏览
哇,你好用心呀!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马