python基本的几种算法

本文详细介绍了四种基本排序算法:冒泡排序、插入排序、选择排序和快速排序。通过代码实现展示了每种排序算法的工作原理,并分析了它们的逻辑。冒泡排序通过不断交换相邻元素实现排序;插入排序则将无序元素插入到已排序部分;选择排序每次找到最小元素并放到正确位置;快速排序利用分治策略,选取临界点将列表分为两部分进行排序。这些排序算法在不同场景下各有优劣,对于理解数据结构和算法有着重要作用。
摘要由CSDN通过智能技术生成

冒泡算法

冒泡排序: 最一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

冒泡排序算法的运作如下:
比较相邻的元素。如果第一个比第二个大(升序),就交换他们两个。
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
冒泡排序的分析
交换过程图示(第一次):
在这里插入图片描述

# 冒泡排序 每次遍历都会产生一个最大的 把最大的放在列表的后面
def bubble_sort(li1):
    n = len(li1)
    for i in range(n-1, 0, -1):
        for j in range(0, i):
            if li1[j] > li1[j+1]:
                li1[j], li1[j+1] = li1[j+1], li1[j]
    print(li1)
# 精髓就是每次遍历内层循环都会把最大的数推到后面

插入排序

插入排序我觉得和冒泡排序有点共同处
插入排序有几个步骤

  • 首先我们先假设列表索引为0的元素已经是最小了
  • 然后接下来我们拿第二个元素和他前面的对比,如果当前元素小于前面的,那就交换位置
  • 假设当前外层循环遍历到索引为7的元素了,那么那个元素得和他前面所有元素进行对比,然后放到适合位置。这个插入排序是将无序的数据插入到前面有序的里面,而冒泡是将无序的数据进行对比然后将最大的放后面。
    """插入排序"""
    n = len(li2)
    # 假设第一个是数据是排好序的是最小的 那我们应该从 第二个开始排序
    for i in range(1, n):
        for j in range(i, 0, -1):
            if li2[j] < li2[j-1]:
                li2[j], li2[j-1] = li2[j-1], li2[j]
    print(li2)

选择排序

  • 先假设外层循环当前遍历的元素就是最小值
  • 然后从当前值遍历到列表尾部,在此范围内的所有值都和这个假设的最小值就行对比,如果比最小值还要小那就是当前最小啦,就要交换位置
  • 外层循环每遍历一次都,内层循环都会确定一个最小值
    在这里插入图片描述
def selection_sort(li1):
    n = len(li1)
    for i in range(n):
        min_max_index = i
        for j in range(i+1, n):
            if li1[min_max_index] > li1[j]:
                li1[min_max_index], li1[j] = li1[j], li1[min_max_index]
    print(li1)

快速排序

  • 首先将第一个元素当作临界点,如果数据排好序后,应该是所有比这个临界点小的都是他左边,所有比这个零界点大的都是他右边
  • 先保存这个零界点的值- mid
  • 因为我们的零界点是假设左边第一个元素,接下来我们从右边,即列表末尾,如果列表末尾的元素比临界值小,那么这个值就应该放到临界值的左边,放到临界值的位置。否则就继续从右往左遍历
  • 上述的右边数据放到了临界点,那右边就有一个空位了,然后从左边开始和临界值进行对比,如果大于临界值,就放到刚才右边的空位。
  • 最后我们就找到了真正临界点的位置,左边的数据left_alist都比理解点小,右边的数据right_list都比临界点大。
  • 然后我们对两个子列表再进行这样的排序,是不是就产生了四个这样的子序列,到最后子序列只剩两个元素,是不是就排好序了
    在这里插入图片描述
def quick_sort(my_li, start, end):
    """快速排序"""
    if start >= end:
        return
    n = len(my_li) - 1
    left = start
    right = end
    # 假设 最后一个元素就是我们的分界点元素
    mid = my_li[end]
    for i in range(start, end):
        if my_li[i] < mid:
            my_li[i], my_li[left] = my_li[left], my_li[i]
            left += 1
    # print(my_li)
    my_li[left], my_li[end] = my_li[end], my_li[left]
    quick_sort(my_li, 0, left-1)
    quick_sort(my_li, left+1, end)


li14 = [11,44,2,6,7,5,2,1,2,68,7,22,9,3]
quick_sort(li14, 0, len(li14)-1)
print(li14)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值