笔记 | 排序算法实现(Python)

排序算法

排序类型 时间复杂度
选择排序(Selection Sort) O ( n 2 ) O(n^{2} ) O(n2)
合并/归并排序(Merge Sort) O ( n log ⁡ n ) O(n\log n ) O(nlogn)
快速排序(Quick Sort) 平均情况 O ( n log ⁡ n ) O(n\log n ) O(nlogn)最糟情况 O ( n 2 ) O(n^{2} ) O(n2)
计数排序(Counting Sort) O ( n + k ) O(n+k ) O(n+k)

一、选择排序

来自《算法图解》一书

python 复制代码
def findSmallest(arr):
    smallest = arr[0]  # 存储最小值
    smallest_index = 0  # 存储最小值索引
    for i in range(1,len(arr)):
        if arr[i] < smallest:
            smallest = arr[i]
            smallest_index = i
    return smallest_index

def selectionSort(arr):
    newArr = []
    for i in range(len(arr)):
        smallest_ind = findSmallest(arr)
        newArr.append(arr.pop(smallest_ind))
    return newArr

print(selectionSort([5,3,6,2,10,58,23,31,9,14,4,46,25,35,1,56,29,20,18,43,40,36,49]))

结果:

二、合并/归并排序

参考: Python实现合并排序(归并排序)(一文看懂)

  1. 将一个序列从中间位置分成两个序列;
  2. 在将这两个子序列按照第一步继续二分下去;
  3. 直到所有子序列的长度都为1,也就是不可以再二分截止。这时候再两两合并成一个有序序列即可。
python 复制代码
def merge(arr_a, arr_b):
    arr_c = []
    i = j = 0
    while i < len(arr_a) and j < len(arr_b):
        if arr_a[i] < arr_b[j]:
            arr_c.append(arr_a[i])
            i += 1
        else:
            arr_c.append(arr_b[j])
            j += 1
    if i == len(arr_a):
        return arr_c + arr_b[j:]
    else:
        return arr_c + arr_a[i:]

def mergeSort(arr):
    if len(arr) < 2:
        return arr
    middle = len(arr) // 2
    left = mergeSort(arr[:middle])
    right = mergeSort(arr[middle:])
    return merge(left, right)

print(mergeSort([23,12,3,7,5,32,37,29,15,24,19]))

结果:

三、快速排序

来自《算法图解》一书

  1. 选择基准值
  2. 将数组分成两个子数组:小于基准值的元素和大于基准值的元素
  3. 对这两个子数组进行快速排序
python 复制代码
def quickSort(arr):
    if len(arr) < 2:
        return arr  # 基线条件:为空或只包含一个元素的数组是"有序"的
    else:
        pivot = arr[0]  # 递归条件,基准值
        less = [i for i in arr[1:] if i <= pivot]  # 由所有小于基准值的元素组成的子数组
        greater = [i for i in arr[1:] if i > pivot]  # 由所有大于基准值的元素组成的子数组
        return quickSort(less) + [pivot] + quickSort(greater)

print(quickSort([10,28,2,36,45,23,14,39,32,24]))

结果:

四、计数排序

参考: python实现【计数排序】(Count Sort)

  1. 找出待排序的数组中最大和最小的元素;
  2. 统计数组中每个值为i的元素出现的次数,存入count_nums数组的第i项;
  3. 将count_nums数组中从左向右每一个计数不为0的值依次填充进最终的res排序数组中。
python 复制代码
def countingSort(arr):
    max_value = max(arr)
    res = []
    count_nums = [0 for i in range(max_value + 1)]
    for num in arr:
        count_nums[num] += 1
    for i in range(len(count_nums)):
        if count_nums[i] != 0:
            # res.extend(count_nums[i] * [i]) # 元素i有 count_nums[i]个,添加入最终的排序数组
            res += count_nums[i] * [i]
    return res

print(countingSort([12,30,2,29,23,18,5,7,25,15,8]))

结果:

相关推荐
Chef_Chen7 分钟前
从0开始机器学习--Day17--神经网络反向传播作业
python·神经网络·机器学习
千澜空27 分钟前
celery在django项目中实现并发任务和定时任务
python·django·celery·定时任务·异步任务
霍格沃兹测试开发学社测试人社区28 分钟前
软件测试学习笔记丨Flask操作数据库-数据库和表的管理
软件测试·笔记·测试开发·学习·flask
斯凯利.瑞恩34 分钟前
Python决策树、随机森林、朴素贝叶斯、KNN(K-最近邻居)分类分析银行拉新活动挖掘潜在贷款客户附数据代码
python·决策树·随机森林
幸运超级加倍~1 小时前
软件设计师-上午题-16 算法(4-5分)
笔记·算法
yannan201903131 小时前
【算法】(Python)动态规划
python·算法·动态规划
蒙娜丽宁1 小时前
《Python OpenCV从菜鸟到高手》——零基础进阶,开启图像处理与计算机视觉的大门!
python·opencv·计算机视觉
光芒再现dev1 小时前
已解决,部署GPTSoVITS报错‘AsyncRequest‘ object has no attribute ‘_json_response_data‘
运维·python·gpt·语言模型·自然语言处理
王俊山IT1 小时前
C++学习笔记----10、模块、头文件及各种主题(一)---- 模块(5)
开发语言·c++·笔记·学习
好喜欢吃红柚子1 小时前
万字长文解读空间、通道注意力机制机制和超详细代码逐行分析(SE,CBAM,SGE,CA,ECA,TA)
人工智能·pytorch·python·计算机视觉·cnn