常见算法

博客介绍了二分查找及多种排序算法。冒泡排序通过比较找出最大值;插入排序构建有序序列,将未排序数据插入合适位置;选择排序在未排序序列找最小(大)元素放到排序序列;快速排序以基准分割数据并递归排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.二分查找

def half_search(list,num):
    n =len(list)
    # 确定要查找的范围的起始索引和结束索引
    start = 0
    end = n-1
    while end >= start:
        mid = (start + end) // 2
        # 如果中位数大于查询的数,说明该查找的数在中位数的左边
        if list[mid] > num:
            end = mid-1
        # 如果中位数小于查询的数,说明该查找的数在中位数的右边,需要缩小查询的范围
        elif list[mid] < num:
            start = mid + 1
        else:
            print('查到了,索引为{}'.format(mid))
            break
    # 如果查找end和start不正常 就是不存在这个数
    else:
        print('查无此数')
if __name__ == '__main__':
    list=[1,2,3,4,5,6,7,8,9]
    num = int(input('请输入要查找数:'))
    half_search(list,num)

2.冒泡排序
冒泡排序就是每次从一个列表中比出一个最大值,然后再在剩下的列表中比较拿出最大值,依次下去呈现的状况就是大的数往一个方向‘冒’


def bubble_sort(list):
    # 每次循环比较的次数依次减少,第一轮比较的次数为列表长度减一
    for i in range(len(list)-1,0,-1):
        # 第一轮比较len(list)-1 次,下一轮比较的次数减一,因为最大的数已经拿出,不再参与比较
        for j in range(i):
            # 如果左边的大于右边的,互换位置
            if list[j] > list[j+1]:
                list[j],list[j+1]=list[j+1],list[j]
    return list
list = [1,5,3,6,2]
print(bubble_sort(list))  #[1, 2, 3, 5, 6]

3.插入排序
插入排序(英语:Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

在这里插入图片描述

# 插入排序
def insertsort(list):
    for i in range(1,len(list)):
        j = i-1
        if list[i] < list[j]:
            list[j],list[i] = list[i],list[j]
        j = j -1   # 将索引提前一个,和前面的数进行比较
        while j>=0 and list[j] >list[j+1]:  # 循环和前面的数进行比较
            list[j],list[j+1] = list[j+1],list[j]
            j =j -1
s = [1,5,6,2,3,1,8,4,5,2,9]
insertsort(s)
print(s)   # [1, 1, 2, 2, 3, 4, 5, 5, 6, 8, 9]

4.选择排序
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对n个元素的表进行排序总共进行至多n-1次交换。在所有的完全依靠交换去移动元素的排序方法中,选择排序属于非常好的一种。

# 选择排序
def findsamll(list):
    small_one = list[0]
    small_index = 0
    for i in range(1,len(list)):  # 当列表长度只有1时直接跳过 返回 最小值索引0
        if list[i] < small_one:
            small_one = list[i]
            small_index = i
    return small_index
def select_sort(list):
    new_list = []
    for i in range(len(list)):
        small_index  = findsamll(list)  # 每次循环找出最小值的索引,弹出添加到新列表
        new_list.append(list.pop(small_index))
    return new_list

list = [1,5,6,2,3,1,8,4,5,2,9]
print(select_sort(list))  # [1, 1, 2, 2, 3, 4, 5, 5, 6, 8, 9]

5.快速排序

快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
步骤为:
⑴从数列中挑出一个元素,称为"基准"(pivot),
⑵重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
⑶递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。

def quick_sort(list):
    if len(list)<2:  # 如果列表元素个数小于2,直接返回列表即可
        return list
    else:
        privot = list[0]
        same = [i for i in list if i == privot] # 如果有重复的数不会去重
        less = [i for i in list if i < privot] # 比基准值小的数,放左边
        greater = [i for i in list if i > privot] # 比基准值大的数,放右边
        return quick_sort(less) + same + quick_sort(greater)  # 递归对左边和右边的数进行排序

list = [1, 2, 3, 1, 5, 6, 2, 3]
print(quick_sort(list))   # [1, 1, 2, 2, 3, 3, 5, 6]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值