Python学习总结——三大基础排序算法总结

  • 本博客主要对三大基础排序算法进行总结,主要是冒泡排序、选择排序、插入排序。
一、冒泡排序

1、冒泡法
冒泡法属于交换排序,两两比较大小,交换位置。如同水泡咕嘟咕嘟往上冒,结果分为升序和降序排列。

2、升序逻辑(降序与升序逻辑相反)
n个数从左至右,编号从0开始到n-1,索引0和1的值比较,如果索引0大,则交换两者位置,如果索引1大,则不交换。继续比较索引1和2的值,将大值放在右侧。直到n-2和n-1比较完,第一轮比较完成。第二轮从索引0比较到n-2,因为最右侧n-1位置上已经是最大值了。依次类推,每一轮都会减少最右侧的不参与比较,直至最后2个数比较。

3、代码实现

  • 简单冒泡实现
num_list = [[1,9,8,7,6,5,4,3,2],[1,2,3,4,5,6,7,8,9]
nums = num_list[0]
print(nums)
length = len(nums)
count_swap = 0
count = 0
for i in range(length):
    for j in range(length-i-1): #防止超界
        count +=1
        if nums(j) > nums(j+1):
            num[j],num[j+1] = num[j+1],num[j]
               count_swap +=1
print(nums,count_swap,count)
  • 优化实现:通过flag提升效率), 如果该轮没有交换则退出整体循环
num_list = [[1,9,8,7,6,5,4,3,2],[1,2,3,4,5,6,7,8,9]]
nums = num_list[0]
print(nums)
length = len(nums)
count_swap = 0
count = 0
for i in range(length):
    flag = False
    for j in range(length-i-1): #防止超界
        count +=1
        if nums(j) > nums(j+1):
            num[j],num[j+1] = num[j+1],num[j]
               flag = True
               count_swap +=1
    if not flag:
          break
print(nums,count_swap,count)
二、选择排序

1、简单选择排序
简单选择排序属于选择排序,两类比较大小,找出极值(极大值或极小值)被放置在固定的位置,这个固定位置一般指的是某一端,结果分为升序和降序排列。

2、降序逻辑(升序与降序逻辑相反)
n个数从左至右,索引从0开始到n-1,两两依次比较,记录大值索引,此轮所有数比较完毕,将大数和索引0数交换,如果大数就是索引1,不交换。第二轮,从1开始比较,找到最大值,将它和索引1位置交换,如果它就在索引1位置则不交换。依次类推,每次左边都会固定下一个大数。

3、代码实现

  • 简单代码实现
lst = [1,9,8,7,6,5,4,3,2]
length = len(lst)  #9
for i in range(length):  #比较几轮 i = 0
    maxindex = i
    for j in range(i,length-1):  #j== 0-7
        if lst[j+1] > lst[maxindex]:
            maxindex = j+1
    if i != maxindex:
        lst[maxindex],lst[i] = lst[i],lst[maxindex]
print(lst)
  • 二元选择排序
lst = [1,9,8,5,6,7,4,3,2]
length = len(lst)         
for i in range(length//2):
    maxindex = i
    minindex = length-i-1
    for j in range(i+1,length-i):
        if lst[j] > lst[maxindex]:
            maxindex = j
        if lst[length-j-1] < lst[minindex]:
            minindex = length-j-1
    if lst[maxindex] == lst[minindex]:
        break
    if maxindex != i:
        lst[i],lst[maxindex]=lst[maxindex],lst[i]
        if minindex == i:
            minindex = maxindex
    if minindex != length-i:
        lst[length-i-1],lst[minindex]=lst[minindex],lst[length-i-1]
三、直接插入排序

1、直接插入排序
在未排序序列中,构建一个子排序序列,直至全部数据排序完成;将待排序的数,插入到已经排序的序列中合适的位置 ,增加一个哨兵,放入待比较值 ,让它和后面已经排好序的序列比较,找到合适的插入点。

2、代码实现

nums = [1,9,8,5,6]
lst = [0] + nums
for i in range(2,len(lst)):
    lst[0] = lst[i]
    j = i - 1
    while lst[0] < lst[j]:
        lst[j+1] = lst[j]
        j -= 1
    lst[j+1] = lst[0]
print(lst[1:]) 

3、直接插入排序优化
如果比较操作耗时大的话,可以采用二分查找来提高效率,即二分查找插入排序。但二分查找插入排序仅提高查找速度,插入时涉及的列表元素挪动依旧费时,效率提升不大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值