python实现排序算法

1.直接插入排序,按升序排

原理

用两个for循环,外面的for循环是用来确定待插入有序序列的元素,里面的for循环是用来查找该元素插入的位置

首先要先找到应该插入的位置,然后将该位置后的元素后移,再将该元素插入到该位置,这样一次操作之后,该结点前的列表就是一个有序表了

直到将所有的元素都插入完,那么就是一个有序表了

代码

lst1=[15,26,17,36,54,8,3,12]
def zhijiecharu(lst):
    for i in range(len(lst)):
        enum=lst[i]
        for j in range(len(lst[0:i])):
            if lst[i] < lst[j]:
                lst[j+1:i+1]=lst[j:i]
                lst[j]=enum
                break
    return lst
print("直接插入排序的结果为:",zhijiecharu(lst1))

运行结果:
在这里插入图片描述

2.直接选择排序,按升序排

原理

将序列分为待排序和已排序的序列,已排序的序列放在最前面

每一次都会从待排序的序列找到最大/最小值,加入到已排序序列的最后/最前面的位置

代码

def choice_sort(lst):
    for i in range(len(lst)):
        min1=min(lst[i:])
        ind = lst.index(min1)
        lst[i],lst[ind]=min1,lst[i]
    return lst
print("直接选择排序的结果为:",choice_sort(lst))

运行结果为:
在这里插入图片描述

3.希尔排序

原理

将序列分组,每次分组的大小为列表长度除2.然后在组内将元素进行直接插入排序

实例

例如:有序列:36 25 48 12 65 25 43 58 76 32

第一次分组并排序后的序列为:
分组(d=5):有5个组,每组的内容为:[36,25],[25,43],[48,58],[12,76],[65,32]

组内直接插入排序后:
25 25 48 12 32 36 43 58 76 65

第二次分组并排序后的序列为:
分组(d=2):有2个组,每组的内容为:[25,48,32,43,76],[25,12,36,58,65]

组内直接插入排序后:
25 12 32 25 43 36 48 58 76 65

第二次分组并排序后的序列为:
分组(d=1):有10个组

组内直接插入排序后:
12 25 25 32 36 43 48 58 65 76

代码

def shell_sort(list):
    n = len(list)
    # 初始步长
    gap = n // 2   #每次分组的长度
    while gap > 0:
        for i in range(gap, n):
            # 每个步长进行插入排序
            temp = list[i]
            j = i
            # 插入排序
            while j >= gap and list[j - gap] > temp:
                list[j] = list[j - gap]
                j -= gap
            list[j] = temp
        # 得到新的步长
        gap = gap // 2
    return list
print("希尔排序后的序列为:",shell_sort(lst1))

运行结果为:
在这里插入图片描述

4.冒泡排序

原理

用两个for循环,最外层的for循环,用来控制冒泡的次数,里面的for循环,用来控制每一趟冒泡需要比较的次数。

冒泡的次数应该是数组长度-1,每一趟比较的次数是冒泡次数-1

实例

假设有数组:[53,2,6,4,753,23]

第一次冒泡:

用第一个元素53,去和后面所有的元素进行比较,如果前一个数比后一个数大,就进行对换。53>2,将53与2对换、所以第一次冒泡的第一次比较之后数组为[2,53,6,5,753,23],第二次比较53和6,因为53>6,进行对换[2,6,53,5,753,23]…
直到比较到最后一个数,此时的数组为:[2,6,5,53,23,753]
可以看到,冒泡一次之后,数组中最大的元素就已经到最后一个了,依次类推,第二次冒泡就将除最后一个元素之外的最大值放在了倒数第二个

第二次冒泡之后:[2,6,5,23,53,753]
第三次冒泡之后:[2,6,5,23,53,753]
第四次冒泡之后:[2,5,6,23,53,753]
第五次冒泡之后:[2,5,6,23,53,753]
此时已经结束了,因为只需要冒泡n-1次,假设有2个数,则只需要比较1次,就可以得到大小。

代码

def maopao(lst):
    for i in range(0,len(lst)-1):   #比较趟数,需要比较n-1,
        max=lst[0];
        for j in range(1,len(lst)-i):  #每趟比较次数,n-1次
            if max>lst[j]:
                lst[j-1],lst[j]=lst[j],lst[j-1]  #进行互换
            max = lst[j];
    return lst

运行结果为:
在这里插入图片描述

5.快速排序

原理

先取左边第一个数作为基准值,用两个指针去记录元素,从最右边的指针开始进行比较,如果值比基准值小,就将其值和左边指针对应的元素进行对换,然后从左边开始进行比较,将元素值大于基准值的元素和右指针对应的元素进行对调,一直到左右指针之间没有元素为止,再将基准值放在两个指针中间,这样进行一趟比较之后,基准值左边的都是比基准值小的序列,右边的都是基准值大的序列

然后对左右序列再进行快排序

代码

def kuaipai(list, left, right):
    if left >= right:  #判断下标值
        return list
    jz = list[left]# 将左边第一位定位基准数,以此数将序列分为两部分
    min = left  #开始进行搜索
    max = right
    while left != right:
        while left < right :# 从最右边开始查,找到第一个比基准值小的数
            if list[right] >= jz:
                right -= 1
            else:# 从最左边开始查,查找比基准值大的数
                list[left] = list[right]
                left += 1
                list[right] = list[left]
        list[right] = jz
    #递归调用
    kuaipai(list, min, left - 1)
    kuaipai(list, left + 1, max)
    return list
lst=[13451,24,1234,23,34,43,23]
print(kuaipai(lst,0,len(lst)-1))

运行结果为:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值