排序与查找算法详解

1.排序

1.1 算法的稳定性

排序 :将一组数据,按照某种规则进行排列的操作

排序算法:实现排序操作的过程描述

算法的稳定性 :具有相同关键字的记录排序后其相对位置保持不变,这样的算法是稳定性算法

1.2 交换排序

交换排序:根据序列中两个元素关键字的比较结果来交换各自的位置

交换排序主要有:冒泡排序和快速排序

1.2.1 冒泡排序

冒泡排序 :从末尾开始,重复访问要排序的元素列表(含 n 个元素),依次比较相邻的两个元素,如果逆序(如:从大到小,从z-a),就交换它们的位置,这样一趟下来就将当前最小元素冒泡到第一位了;这样重复 n-1 趟,最终完成元素列表排序

注意:如果从前往后开始,则是每轮沉淀当前最大值元素

代码实现如下:

复制代码
#1.定义函数 bubble_sort(list)
def bubble_sort(list):
    for i in range(len(list)-1):
        flag = True                  #若发生交换则为False
        for j in range(len(list)-1-i):
            if list[j] > list[j+1]:  #若前一个数大于后一个数则交换
                list[j], list[j+1] = list[j+1], list[j]
                flag = False         #发生交换
        if flag == True:           #若未发生交换则说明列表已有序,提前退出
            break
    return list

#2.测试函数
if __name__ == '__main__':
    list = [3,2,1,5,4,6]
    print(bubble_sort(list))

1.冒泡排序是一种稳定的排序算法

  • 最坏时间复杂度:
  • 最优时间复杂度:

1.3 选择排序

选择排序 :第一次从待排序的序列中选择最小(或最大)的一个元素放在序列的起始位置,然后从剩余的未排序元素中继续寻找最小(或最大)元素,放到已排序的序列末尾,以此类推,知道全部有序

代码实现如下:

复制代码
#1.定义函数 select_sort(list)
def select_sort(list):
    for i in range(len(list)-1):
        min_index = i               #记录本轮最小值元素的索引
        for j in range(i+1, len(list)):
            if list[j] < list[min_index]:
                min_index = j
        list[i], list[min_index] = list[min_index], list[i]
    return list
#2.测试函数
if __name__ == '__main__':
    list = [3,2,1,5,4,6]
    print(select_sort(list))

选择排序是一种不稳定的排序算法

  • 最坏时间复杂度:
  • 最坏时间复杂度:

1.4 插入排序

插入排序 :每次将一个待排序记录按其关键字大小插入到前面已经排好序的子序列,直到全部记录插入完成

代码实现如下:

复制代码
#1.定义 insert_sort(list)函数
def insert_sort(list):
    for i in range(1, len(list)):
        key = list[i]
        j = i-1
        while j >=0 and key < list[j]:
            list[j+1] = list[j]
            j -= 1
        list[j+1] = key
    return list
#2.测试函数
if __name__ == '__main__':
    list = [3,2,1,5,4,6,7]
    print(insert_sort(list))

插入排序是一种稳定的排序算法

  • 最坏时间复杂度:
  • 最优时间复杂度:

适用条件 :如果已经有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这时就可以用插入排序算法,算法适用于少量数据的排序

2.查找

2.1 二分查找

二分查找 :又叫折半查找;将有序序列(假设升序)分为3部分,依次是中值前,中值,中值后;将要查找的值与中值进行比较,若小于中值则在中值前查找,若大于中值则在中值后查找,若等于中值直接返回

时间复杂度 :

2.1.1 递归实现

代码实现如下:

复制代码
#1.递归实现:定义 binary_search(list)函数
def binary_search(list, item, offset=0): #offset记录当前切片在原始数组的起点下标
    if len(list) == 0:      #递归退出条件1
        return None
    mid = len(list)//2
    if list[mid] == item:   #递归退出条件2
        return offset + mid
    elif item < list[mid]:
        return binary_search(list[:mid], item, offset)
    else:
        return binary_search(list[mid+1:], item, offset + mid + 1)
    return None            #走到这步说明没有找到,返回False
#2.函数测试
list = [0, 1, 2, 8, 13, 17, 19, 32, 42]
print(binary_search(list, 13))
  • 最坏空间复杂度:
  • 最优空间复杂度:

2.1.2 非递归实现

复制代码
#1.定义 binary_search(list)函数
def binary_search(list, item):
    low = 0                #初始化low
    high = len(list) - 1   #初始化high
    while low <= high:
        mid = (low + high) // 2
        if item == list[mid]:
            return mid
        if item < list[mid]:
            high = mid - 1
        else:
            low = mid + 1
    return None

#2.测试函数
if __name__ == '__main__':
    list = [1, 2, 3, 4, 5, 6, 7, 8, 9,10]
    print(binary_search(list, 0))
相关推荐
怕浪猫3 小时前
RAG 面试 6 连问,从原理到优化全部覆盖
python·算法·面试
高洁014 小时前
具身智能中的世界模型训练
人工智能·python·深度学习·机器学习·transformer
无线通信科研笔记4 小时前
IEEE TVT 2026 论文精读与完整复现|相位误差如何重塑近场 RIS 的幅相响应
论文阅读·人工智能·python·算法·论文笔记
朝朝辞暮i4 小时前
VLA 系统学习第 1 课:VLA 到底在干什么?
人工智能·python·计算机视觉·vla
2601_962885725 小时前
如何用 Python 自动识别股票的支撑位与压力位?
开发语言·python
爱吃奥利奥_wen5 小时前
面向对象三板斧:封装、继承、多态,到底在“装“什么、“承“什么、“变“什么?
开发语言·经验分享·c#
北冥有鱼被烹5 小时前
VCSEL全景解析:与光模块NPO CPO的关系、市场量化分析与产业链影响
python
我可能是个假开发5 小时前
FTP Unicode 文件名导致 `550` 的问题分析与解决方案
java·开发语言·spring
caoerzhong5 小时前
中小企业上 WMS 该先上哪几块:JeeWMS 开源 Java 仓库管理系统的分批上线清单
java·python·开源
正在走向自律6 小时前
AI数据分析与可视化:从基础到应用实践
服务器·人工智能·python·机器学习·数据分析·pandas