当前位置:   article > 正文

Python数据结构与算法笔记(四):排序问题——列表排序_import randomli = [random.randint(1, 100) for i in

import randomli = [random.randint(1, 100) for i in range(10)] print(li)

排序

在这里插入图片描述
常见的排序算法:
在这里插入图片描述

列表排序Low三人组

冒泡排序,选择排序,插入排序

冒泡排序

在这里插入图片描述

原始数据。
在这里插入图片描述
将7和5进行比较,若7大于5,则交换。
在这里插入图片描述
8比7大,不进行交换,接下来看8.用8跟2进行比较。
在这里插入图片描述
最后,就把最大的9排上去了。箭头指到1,不会指到9,因为9后面没有数据了。冒泡排序,逐个将最大的选出来。
在这里插入图片描述
上面的为有序区,下面的为无序区。接下来,对无序区再来一遍。
在这里插入图片描述
在这里插入图片描述
整个排序是n-1次。
在这里插入图片描述
无序区的范围:n-i-1.
i:第i趟。
1:最后的不计。

def bubble_sort(li):
    for i in range(len(li)-1):# 排了n-1趟,第i趟
        for j in range(len(li)-i-1): # 箭头
            if li[j] > li[j+1]: #如果箭头指的数,大于箭头后面的数
                li[j],li[j+1] = li[j+1],li[j]
  • 1
  • 2
  • 3
  • 4
  • 5

升序:

import random
li = [random.randint(0,100) for i in range(10)]
print(li)
[94, 60, 24, 65, 57, 38, 85, 75, 9, 91]

bubble_sort(li)
print(li)
[9, 24, 38, 57, 60, 65, 75, 85, 91, 94]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

降序:

def bubble_sort(li):
    for i in range(len(li)-1):
        for j in range(len(li)-i-1): 
            if li[j] < li[j+1]: 
                li[j],li[j+1] = li[j+1],li[j]
  • 1
  • 2
  • 3
  • 4
  • 5

如果没有继续发生交换,则认为已经排好序了。就可以无后续过程,节省时间。

li=[9,8,7,1,2,3,4,5,6]
print(li)
[9, 8, 7, 1, 2, 3, 4, 5, 6]

bubble_sort(li)
[8, 7, 1, 2, 3, 4, 5, 6, 9]
[7, 1, 2, 3, 4, 5, 6, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

改进代码如下:

def bubble_sort(li):
    for i in range(len(li)-1):# 排了n-1趟,第i趟
        exchange= False
        for j in range(len(li)-i-1): # 箭头
            if li[j] > li[j+1]: #如果箭头指的数,大于箭头后面的数
                li[j],li[j+1] = li[j+1],li[j]
                exchange= True
        print(li)
        if not exchange:
            return
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
li=[9,8,7,1,2,3,4,5,6]
print(li)
[9, 8, 7, 1, 2, 3, 4, 5, 6]

bubble_sort(li)
[8, 7, 1, 2, 3, 4, 5, 6, 9]
[7, 1, 2, 3, 4, 5, 6, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

时间复杂度:
在这里插入图片描述
冒泡排序优化:
在这里插入图片描述

选择排序

在这里插入图片描述
简单的排序算法:

def select_sort_simple(li):
    li_new = []
    for i in range(len(li)):
        min_val = min(li)
        li_new.append(min_val)
        li.remove(min_val)
    return li_new
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
li = [3,2,1,4,5,6,7,8,9]
select_sort_simple(li)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
  • 1
  • 2
  • 3

不足之处:
1.生成两个列表,多占了内存。
2.min()和remove()操作,都不是O(1)的操作。其中min()需要遍历列表,remove()操作在删除元素后,需要补位。

更好的选择排序:

def select_sort(li):
    for i in range(len(li)-1):# i是第几次
        min_loc=i
        # 记录最小值的位置,先假设最左边的是最小值,即无序区的第一个数的位置
        for j in range(i+1,len(li)):# 无序区的长度,i+1省去自己跟自己比
            if li[j] < li[min_loc]:
                min_loc = j
        li[i],li[min_loc] = li[min_loc],li[i]
        print(li)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
li = [1,8,5,7,6,9,4,2,1,3]
select_sort(li)
[1, 8, 5, 7, 6, 9, 4, 2, 1, 3]
[1, 1, 5, 7, 6, 9, 4, 2, 
  • 1
  • 2
  • 3
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/488885
推荐阅读
相关标签
  

闽ICP备14008679号