python实现三种常见的排序:冒泡排序、 选择排序、插入排序

277 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

python实现三种常见的排序

冒泡排序

时间复杂度 O(n^2^)

冒泡排序是我们最开始学的一种排序方式,熟练的掌握冒泡排序对我们以后学习其他的排序有很大的帮助


# 冒泡排序
#   列表每相邻的数,如果前面比后面大,则交换这两个数
#   一趟排序完成后,则无序区减少一个数,有序增加一个数
import random
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]


# 优化
# 当数据不再交换的时候,排序已经完成,就可以结束循环,减少时间
from cal_time import cal_time

def bubble_sort(li):
    for i in range(len(li)-1):
        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
        if not exchange:
            return
# 测试
# 使用random随机模块
# 列表生成式
li =[random.randint(1,10000) for i in range(1000)]
print(li)
bubble_sort(li)
print(li)

lit = list(range(10000))
# random.shuffle(lit) 打乱列表
random.shuffle(lit)
bubble_sort(lit)

选择排序

时间复杂度 O(n^2^)

选择排序的时间复杂度和空间复杂度都比较高,

# 选择排序
# 简陋写法
# 确定,时间复杂度高,空间复杂度高 非原地排序
import random

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

# 优化
# 算法关键: 有序区和无序区, 记录无序区最小数的位置
def select_sort(li):
    for i in range(len(li)-1):
        min_loc = i
        for j in range(i+1,len(li)):
            if li[j] < li[min_loc]:
                min_loc = j
        li[i], li[min_loc] = li[min_loc], li[i]



lit = list(range(10000))
# random.shuffle(lit) 打乱列表
random.shuffle(lit)
select_sort(lit)

插入排序

时间复杂度 O(n^2^)

将所有的元素看成扑克牌,选则排序就象对摸到的扑克牌进行排序一样, 第一个元素看成底牌,后面的元素为未知的

每次摸一张牌 从右向左依次比较,当所摸得牌大于比较所比较的牌 将摸到的牌放在所比较的牌的右面 当所摸得牌小于比较所比较的牌,所比较的牌向右移动一个位置,腾出位置,然后继续进行比较,

import random
from cal_time import *


@cal_time
def insert_sort(li):
    for i in range(1, len(li)):
        tmp = li[i]
        j = i-1
        # 找插入的位置
        # 从右往左比较,如果tmp小于l[j],l[j]他的位置就向右移一个位置,
        while j >= 0 and li[j] > tmp:
            li[j+1] = li[j]
            j = j-1
        li[j+1] = tmp


li = [1,5,9,6,4,9,4,5,5,9,4,6]
insert_sort(li)
print(li)

lit = list(range(10000))
# random.shuffle(lit) 打乱列表
random.shuffle(lit)

insert_sort(lit)