常见排序算法(冒泡排序/快速排序/插入排序/选择排序)

本文详细介绍了五种排序算法(冒泡排序、快速排序、插入排序、选择排序)和二分查找算法的原理、动图演示及代码实现。通过直观的动图展示和清晰的代码解释,帮助读者理解各种算法的工作过程和特点。

冒泡排序(Bubble Sort)
原理
  1. 比较相邻的元素,如果前一个元素大于后一个元素,则交换位置
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样最大的数会跑到最后
  3. 针对所有的元素重复以上的步骤,除了最后一个
  4. 重复步骤1-3,直到排序完成

时间复杂度 O ( n 2 ) O(n^2) O(n2),空间复杂度 O ( 1 ) O(1) O(1),稳定算法

稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面

不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面

动图演示

在这里插入图片描述

代码实现
def bubble_sort(arr):
    length = len(arr)
    for i in range(length -1):
        # 如果一次循环完了之后没有进行交换,说明arr本身就有序,后续循环无需再做
        flag = False
        for j in range(length - i - 1):
            if arr[j] > arr[j + 1]:
                arr[j], arr[j + 1] = arr[j + 1], arr[j]
                flag = True
        if not flag:
            break
    return arr
快速排序(Quick Sort)
原理

利用递归的思想,一开始选择一个基准值,大于这个基准值的数存放到一个列表中,其他值存放到另一个列表中,然后这俩个列表进行递归操作

时间复杂度是 O ( n l o g 2 n ) O(nlog_{2}n) O(nlog2n),空间复杂度也是 O ( n l o g 2 n ) O(nlog_{2}n) O(nlog2n),不稳定算法

动图演示

在这里插入图片描述

代码实现
def quick_sort(arr):
    length = len(arr)
    if length <= 1:
        return arr
    else:
        pivot = arr.pop()
        greater, lesser = [], []
        for element in arr:
            if element > pivot:
                greater.append(element)
            else:
                lesser.append(element)
        return quick_sort(lesser) + [pivot] + quick_sort(greater)
插入排序(Insertion Sort)
原理
  1. 将第一个元素认为已经排号序
  2. 依次从剩余序列中取出待排序的元素,和已经排序的元素序列从后向前进行比较
  3. 如果已排序元素大于待排序元素,则将已排序元素移到下一位置
  4. 重复步骤3,直到找到已排序的元素小于或者等于未排序元素的位置,将待排序元素插入到该位置后

时间复杂度 O ( n 2 ) O(n^2) O(n2),空间复杂度 O ( 1 ) O(1) O(1),稳定算法

动图演示

在这里插入图片描述

代码实现
def insertion_sort(arr):
    for loop_index in range(1, len(arr)):
        insertion_index = loop_index
        while insertion_index > 0 and arr[insertion_index - 1] > arr[insertion_index]:
            arr[insertion_index - 1], arr[insertion_index] = arr[insertion_index], arr[insertion_index - 1]
            insertion_index -= 1
    return arr
选择排序(Selection Sort)
原理

首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕

时间复杂度 O ( n 2 ) O(n^2) O(n2),空间复杂度 O ( 1 ) O(1) O(1),不稳定算法

动图演示

在这里插入图片描述

代码实现
def select_sort(arr):
    length = len(arr)
    for i in range(length - 1):
        least = i
        for j in range(i + 1, length):
            if arr[j] < arr[least]:
                least = j
        arr[least], arr[i] = arr[i], arr[least]
    return arr
二分查找(Binary Search)
原理

将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果x<a[n/2],则只要在数组a的左半部分继续搜索x,如果x>a[n/2],则只要在数组a的右半部搜索x

时间复杂度: O ( l o g 2 n ) O(log_{2}n) O(log2n)

代码实现
def binary_search(arr, num):
    left, right = 0, len(arr) - 1
    while left < right:
        mid = (left + right) // 2
        if arr[mid] == num:
            return mid
        elif arr[mid] > num:
            right = mid - 1
        else:
            left = mid + 1
    else:
        return None

注意:数组a必须是有序的

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值