排序算法 python

"""
    author = xcy
    代码参考别人,尽量自己写了 =。=
    命名规则不太好,不建议用list命名,但不好改了。
    写的过程中遇到的问题都写在注释中
    以下方法都在PyCharm中调试过,python3.7,但测试用例不多,难免有错误望批评指正
    刚发现shell排序代码有问题,网上的博客都是照搬的啊,错的也搬。。还有归并和堆排序,有机会填坑
"""

import random
import time
random.seed(10)
L = [random.randint(1, 101) for _ in range(20)]
print(L)


# 冒牌排序,这个是把最大值冒泡到最后,注意和select的区别
def bubble(list):
    l = len(list)
    for i in range(l):
        for j in range(0, l - i - 1):
            if list[j] > list[j + 1]:
                list[j], list[j + 1] = list[j + 1], list[j]
    return list


# 选择排序,本来把选择排序写成了把最小值通过和冒泡一样的方法放到最前面,但选择不是反向冒泡。。
# 这里和冒泡的区别可以理解为交换的次数更少,因为是将当前的数和list[min]比较(list[min]是已经遍历过的最小值
# 所以之后发生交换的可能性更小,但冒泡是选大的往后排,交换的可能性更大
def select(list):
    l = len(list)
    for i in range(l):
        for j in range(i, l):                             
            if list[i] > list[j]:                       
            	# !依然是通过交换保证数据数据不丢失,刚开始写的时候各种操作导致数据数据丢了,结果也就不对了,
            	# 如果不是交换数据一般别动原数组,交换是只交换数值,交换完min的值仍然为当前的下标
                list[i], list[j] = list[j], list[i]
    return list                                        


# 插入排序,怎么找到插入的地方??,并将元素后移并返回位置。。开始写了个三重循环 = =
def insert(list):                                        
    l = len(list)
    for i in range(l):
        # 这里用for循环比较别扭,毕竟外层的循环并不知道j的值,但这样这程序依然跑的通
        # 这里是j-1而不是j,是j的话,循环直接跳过了
        # 右移操纵需要逆序遍历,左移是正序遍历list[i] = list[i + 1]
        # tmp = list[i]
        # for j in range(i, -1, -1):                     
        #     if tmp < list[j - 1]:                      
        #         list[j] = list[j - 1]               
        #     else:
        #         break
        # list[j] = tmp
        # 建议用while循环写,清晰明了,后移数组且要得到j的值
        tmp = list[i]                                    
        j = i
        # 这里是and不是&,而且比较的是tmp和list[j-1]而不是list[j]和list[j-1],!!j在一直变化,自己写问题还是多啊
        while tmp < list[j - 1] and j > 0:               
            list[j] = list[j - 1]
            j = j - 1
        list[j] = tmp
    return list


# 待修改
# 希尔排序,插入排序的改进
def shell(list):
    step = len(list) // 2#python3中//为向下取整
    while step > 0:
        # 以下为按步长的类似插入排序。。和插入排序类似,不理解的先去理解下插入排序,这里多了个step步长,插入排序是后移,这里是交换
        for i in range(step, len(list)):
            while(i >= step and list[i] < list[i - step]):
                list[i], list[i - step] = list[i - step], list[i]
                i = i - step                              #建议到http://www.pythontutor.com/模拟一下理解过程,i和i-step之间的关系
        step = step // 2
    return list


# 写了bubble就继续写进阶版的快排--都是交换类型的排序(个人认为,选择排序应该也算是交换类的排序8
# 算法导论的写法,对递归理解还是不好。。自己还是不会
def QuickSort(list, left ,right):
    if left < right:
        base = Partition(list, left, right)
        QuickSort(list, left, base - 1)
        QuickSort(list, base + 1, right)
# Partition函数是关键,i代表小于list[right]的个数,j遍历整个部分,满足条件i+1,i和j下标进行交换
def Partition(list, left, right):                        
    # i代表有多少个比基准值小的书,放在左边
    i = left - 1
    # 如果实在不理解这里可以参考这个网站,自己写个简单的数组试试Partition函数 http://www.pythontutor.com/ 不用翻墙贼方便
    for j in range(left, right):
        if list[j] <= list[right]:
            i = i + 1
            list[i], list[j] = list[j], list[i]
    list[i + 1], list[right] = list[right], list[i + 1]
    return i + 1


# print(bubble(L))
# print(select(L))
# print(insert(L))
# print(shell(L))
# QuickSort(L, 0, len(L) - 1)
# print(L)


# t0 = time.time()
# bubble(L)
# print(L)
# print(time.time() - t0)

# for i in range(len(L)):
#     if i not in L:
#         print(i)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值