排序算法之python实现(上)

前言

本文讲述python实现选择排序、冒泡排序、插入排序以及实例应用。后续还会有新的排序算法实现及实例应用。

一、选择排序

所谓的选择排序就是反复从未排序的序列中,取出最大或者最小元素插入到新的数列里,最终形成一个有序得序列。选择排序有两类分别为递增排序和递减排序。

  • 递增排序:每次选择未排序序列中最小的,与未排序数列的第一个值进行交换。
  • 递减排序:每次选择未排序序列中最大的,与未排序数列的第一个值进行交换。

(1)代码看排序过程

data = [56,18,49,84,72]
def choose_high(data):
    for i in range(len(data)-1):#遍历列表
        for j in range(i+1,len(data)):#每一次从上一次排好的后面扫描
            if data[i] > data[j]:#递增排序,小的放前面;递减排序只需要把大于换成小于
                data[i],data[j] = data[j],data[i]
        print("第",i+1,"次排序的结果:",end="")
        for i in data:
            print("%3d"%i,end="")
        print("")
print("递增排序:")
print("排序之前的序列为:",end="")
for i in data:
    print("%3d"%i,end="")
print("\n================================")
print("排序过程如下:")
choose_high(data)
print("================================")
print("排序之后的序列为:",end="")
for i in data:
    print("%3d"%i,end="")
运行结果:
递增排序:
排序之前的序列为: 56 18 49 84 72
================================
排序过程如下:
第 1 次排序的结果: 18 56 49 84 72
第 2 次排序的结果: 18 49 56 84 72
第 3 次排序的结果: 18 49 56 84 72
第 4 次排序的结果: 18 49 56 72 84
================================
排序之后的序列为: 18 49 56 72 84
Process finished with exit code 0

(2)代码的实例应用

# 给下列成绩从大到小排序
dic = {"haha":90,"xixi":100,"koko":80,"niki":75,"baby":88}
# 定义一个函数,表示按照成绩从大到小排序
def key(x):
    return x[1]
def choose_low(data:list,key):
    for i in range(len(data)-1):
        for j in range(i+1,len(data)):
            if (key(data[i])<key(data[j])):
                data[i],data[j] = data[j],data[i]
    return data
dic_item = list(dic.items())#必须转化成列表
print("排序前:")
for i in range(len(dic_item)):
    print(dic_item[i])
print("排序后:")
after_sort = choose_low(dic_item,key)
for index,info in enumerate(after_sort):
    print("第",index+1,"名",info)
运行结果:
排序前:
('haha', 90)
('xixi', 100)
('koko', 80)
('niki', 75)
('baby', 88)
排序后:
第 1 名 ('xixi', 100)
第 2 名 ('haha', 90)
第 3 名 ('baby', 88)
第 4 名 ('koko', 80)
第 5 名 ('niki', 75)

Process finished with exit code 0

二、冒泡排序

冒泡排序的思想是从第一个数开始,一次比较相邻的两个数的大小,将其从小到大或者从大到小排列。

(1)代码看排序过程

data = [56,20,84,66,13]
def bubles(data):
    i = len(data)-1 #控制要排序的次数,排序次数为排序个数减一
    while (i>0):
        for j in range(i):
            if data[j]>data[j+1]:
                data[j],data[j+1] = data[j+1],data[j]
        print("第%d排序过程为:"%(len(data)-i), end="")
        i -= 1
        for k in data:
            print("%3d"%k,end="")
        print("")
print("冒泡排序前:",end="")
for i in data:
    print("%3d"%i,end="")
print("\n==========================")
print("开始冒泡排序……")
bubles(data)
print("============================")
print("冒泡排序后:",end="")
for i in data:
    print("%3d"%i,end="")
运行结果:
冒泡排序前: 56 20 84 66 13
==========================
开始冒泡排序……
第1排序过程为: 20 56 66 13 84
第2排序过程为: 20 56 13 66 84
第3排序过程为: 20 13 56 66 84
第4排序过程为: 13 20 56 66 84
============================
冒泡排序后: 13 20 56 66 84
Process finished with exit code 0

(2)代码的实例运用

data = {"王一博":98,"张彬彬":100,"吴磊":97,"杨洋":99}
def key(x):
    return x[1]
def bubles(data:list,key):
    i = len(data)-1 #控制要排序的次数,排序次数为排序个数减一
    while (i>0):
        for j in range(i):
            if key(data[j])<key(data[j+1]):
                data[j],data[j+1] = data[j+1],data[j]
        print("第%d排序过程为:"%(len(data)-i), end="")
        i -= 1
        for k in data:
            print(k,end="")
        print("")
data2 = list(data.items())
print("冒泡排序前:",end="")
for i in data2:
    print(i,end="")
print("\n==============================================================")
print("开始冒泡排序……")
bubles(data2,key)
print("==============================================================")
print("冒泡排序后:")
for index,info in enumerate(data2):
    print("第",index+1,"名:",info)
运行结果:
冒泡排序前:('王一博', 98)('张彬彬', 100)('吴磊', 97)('杨洋', 99)
==============================================================
开始冒泡排序……
第1排序过程为:('张彬彬', 100)('王一博', 98)('杨洋', 99)('吴磊', 97)
第2排序过程为:('张彬彬', 100)('杨洋', 99)('王一博', 98)('吴磊', 97)
第3排序过程为:('张彬彬', 100)('杨洋', 99)('王一博', 98)('吴磊', 97)
==============================================================
冒泡排序后:
第 1 名: ('张彬彬', 100)
第 2 名: ('杨洋', 99)
第 3 名: ('王一博', 98)
第 4 名: ('吴磊', 97)

Process finished with exit code 0

三、插入排序

插入排序的算法思想是将数列中的元素逐一与排序好的元素比较,进而找到合适的位置插入。

(1)代码看排序过程

data = [58,29,86,69,10]
def insert(data):#从小到大插入排序
    for i in range(len(data)):
        temp = data[i]
        j = i-1#已排好序的最后一个
        while(j>=0 and temp<data[j]):#如果要插入的比排好序的最后一个小
            data[j+1]=data[j]#原来的元素后移一位
            j = j-1
        data[j+1] = temp
        print("第", i + 1, "次排序的结果:", end="")
        for k in data:
            print("%3d"%k,end="")
        print("")
print("插入排序:")
print("排序之前的序列为:",end="")
for i in data:
    print("%3d"%i,end="")
print("\n================================")
print("排序过程如下:")
insert(data)
print("================================")
print("排序之后的序列为:",end="")
for i in data:
    print("%3d"%i,end="")
运行结果:
插入排序:
排序之前的序列为: 58 29 86 69 10
================================
排序过程如下:
第 1 次排序的结果: 58 29 86 69 10
第 2 次排序的结果: 29 58 86 69 10
第 3 次排序的结果: 29 58 86 69 10
第 4 次排序的结果: 29 58 69 86 10
第 5 次排序的结果: 10 29 58 69 86
================================
排序之后的序列为: 10 29 58 69 86
Process finished with exit code 0

(2)代码的实例运用

# 我心目中的美丽女明星颜值打分如下:
data = {"迪丽热巴":99,"赵丽颖":97,"唐诗逸":100,"白鹿":96}
def key(x):
    return x[1]
def insert(data:list,key):#从大到小排序
    for i in range(len(data)):
        temp = data[i]
        j = i - 1#上一次排好序的最后一个
        while (j>=0 and key(temp)>key(data[j])):#如果要插入的比上一次最后还要大
            data[j+1] = data[j]
            j = j - 1
        data[j+1] = temp
        print("第",i+1,"次排序结果:",end="")
        print(data)
data2 = list(data.items())
print("插入排序前:",end="")
for i in data2:
    print(i,end="")
print("\n===========================================================================")
print("开始插入排序……")
insert(data2,key)
print("===========================================================================")
print("插入排序后:")
for index,info in enumerate(data2):
    print("第",index+1,"名:",info)
运行结果:
插入排序前:('迪丽热巴', 99)('赵丽颖', 97)('唐诗逸', 100)('白鹿', 96)
===========================================================================
开始插入排序……
第 1 次排序结果:[('迪丽热巴', 99), ('赵丽颖', 97), ('唐诗逸', 100), ('白鹿', 96)]
第 2 次排序结果:[('迪丽热巴', 99), ('赵丽颖', 97), ('唐诗逸', 100), ('白鹿', 96)]
第 3 次排序结果:[('唐诗逸', 100), ('迪丽热巴', 99), ('赵丽颖', 97), ('白鹿', 96)]
第 4 次排序结果:[('唐诗逸', 100), ('迪丽热巴', 99), ('赵丽颖', 97), ('白鹿', 96)]
===========================================================================
插入排序后:
第 1 名: ('唐诗逸', 100)
第 2 名: ('迪丽热巴', 99)
第 3 名: ('赵丽颖', 97)
第 4 名: ('白鹿', 96)

Process finished with exit code 0

总结

无论是选择排序、冒泡排序还是插入排序,这三种排序的时间复杂度都是O(n^{2})

选择排序是每一次在未排序的序列里面,选择最大或者最小的元素,放在未排序的序列第一位。

冒泡排序是需要有一个外层循环控制排序的次数,内层循环实现相邻的两个数据比较,实现从大到小或者从小到大排序。排序的次数为需要排序元素的个数减一。

插入排序是默认第一次排序确定第一个元素的位置,然后遍历未排序的序列,每一次将为排序的序列插入到合适的位置。算法中设置了一个指针指向上一次排好序的元素,然后将待排序的元素与其比较,将其插入到合适的位置。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值