5种排序算法

文章目录

一,排序算法时间复杂度比较

算法 最坏情况下 平均情况下
插入排序 O(n² ) O(n²)
冒泡排序 O(n²) O(n²)
快速排序 O(n²) O(nlogn)
堆排序 O(nlogn) O(nlogn)
二分归并排序 O(nlogn) O(nlogn)

二,插入排序

假设原始序列为:5,7,1,3,6,2,4

首先假设第一个元素5已经排好,然后插入第二个元素7但是7比5大所以7放在5的右边,接着是第三个元素1,1比7小所以再7左边并且1比5小所以放在5的左边。第四个元素3于7比较比7小在7左边并且比5小所以在5左边但是3比1小所以插入到1和5之间,其他的类似。。。。

原始序列 5 7 1 3 6 2 4
插入零次 5 7 1 3 6 2 4
插入一次 5 7 1 3 6 2 4
插入二次 1 5 7 3 6 2 4
插入三次 1 3 5 7 6 2 4
插入四次 1 3 5 6 7 2 4
插入五次 1 2 3 5 6 7 4
插入六次 1 2 3 4 5 6 7
python 复制代码
a = [5,7,1,3,6,2,4]
n = len(a)
for i in range(1, n):
    key = a[i]  # 当前待插入元素
    j = i - 1  # 已排序部分的最后一个元素的索引
    while j >= 0 and a[j] > key:
        a[j + 1] = a[j]  # 向后移动元素
        j -= 1
    a[j + 1] = key  # 插入元素到正确位置
print(a)
#[1, 2, 3, 4, 5, 6, 7]

三,冒泡排序

假设原始序列为:5,7,1,3,6,2,4

首先5和7比较,5比7小不交换顺序,7和1比较,7比1大交换顺序,7和3比较,7比3大交换顺序,7和6比较7比6大交换顺序,7和4比较,7比4大交换顺序。以此类推

原始序列 5 7 1 3 6 2 4
冒泡一次 5 1 3 6 2 4 7
冒泡二次 1 3 5 2 4 6 7
冒泡三次 1 3 2 4 5 6 7
冒泡四次 1 2 3 4 5 6 7
python 复制代码
a = [5,7,1,3,6,2,4]
n = len(a)
for i in range(n):
    for j in range(0, n-i-1):
        if a[j] > a[j+1]:
            a[j], a[j+1] = a[j+1], a[j]
print(a)
#[1, 2, 3, 4, 5, 6, 7]

四,快速排序

假设原始序列为:5,7,1,3,6,2,4

首先以第一个元素5为划分的标准,从前面找第一个比5大的从后面找第一个比5小的交换位置,然后再找下一个比大的和比5小的交换位置。第二次交换是发生在两个相邻的元素之间做的所以说2前面的都比5小,6后面的都比5大所以2的位置是第一个元素5的位置,然后交换2和5的位置,这样5的位置就定下来了,再分别对两边递归调用同样的方法。

原始序列 5 7 1 3 6 2 4
交换一次 5 4 1 3 6 2 7
交换二次 5 4 1 3 2 6 7
划分 2 4 1 3 5 6 7
递归运行 2 4 1 3 5 6 7
python 复制代码
a = [5,7,1,3,6,2,4]
def fast_sort(a):
    if len(a) <= 1:
        return a
    basis = a[0]
    left_num  = [i for i in a[1::] if i < basis]
    middle    = [i for i in a     if i == basis]
    right_num = [i for i in a[1::] if i > basis]
    return fast_sort(left_num) + middle + fast_sort(right_num)
print(fast_sort(a))
#[1, 2, 3, 4, 5, 6, 7]

五,堆排序

pass

六,二分归并排序

它将待排序的列表递归地分成两个子列表,直到每个子列表只包含一个元素。然后,将这些子列表按照顺序合并,形成一个有序的列表。

假设原始序列为:5,7,1,3,6,2,4

首先先把序列一份为二 (标注和没标注的),然后对每个子列里面也分别进行二分归并排序,然后把已经排好的子数合并(两个序列的首元素比较哪个小就把哪个拿走,知道一个数组空了就把另一个数组全部接在后面)。

原始序列 5 7 1 3 6 2 4
归分 5 4 1 3 6 2 7
递归排序 1 3 4 5 2 6 7
开始组合 1 3 4 5 2 6 7
原 3 4 5 2 6 7
新数组 1
原 3 4 5 6 7
新数组 1 2
原 4 5 6 7
新数组 1 2 3
原 5 6 7
新数组 1 2 3 4
原 6 7
新数组 1 2 3 4 5
原
新数组 1 2 3 4 5 6 7
python 复制代码
a = [5, 7, 1, 3, 6, 2, 4]

def merge_sort(arr):
    if len(arr) <= 1:
        return arr
        
    mid = len(arr) // 2
    left = arr[:mid]
    right = arr[mid:]

    left = merge_sort(left)
    right = merge_sort(right)

    return merge(left, right)

def merge(left, right):
    merged = []
    i = j = 0

    while i < len(left) and j < len(right):
        if left[i] <= right[j]:
            merged.append(left[i])
            i += 1
        else:
            merged.append(right[j])
            j += 1

    while i < len(left):
        merged.append(left[i])
        i += 1

    while j < len(right):
        merged.append(right[j])
        j += 1

    return merged

print(merge_sort(a))
相关推荐
特立独行的猫A3 小时前
用仓颉语言 cj-tauri 框架,五分钟给娃做了个鸿蒙形近字游戏
java·后端·python
大可不必了7 小时前
03 函数定义和调用
开发语言·python
I_belong_to_jesus7 小时前
C++关于分支预测的优化1
开发语言·c++·算法
承渊政道8 小时前
【Python编程—从入门到实践】(记分与闯关:用Python+Pygame,打造越战越精彩的太空大战!)
开发语言·python·pycharm·游戏程序·pygame
爱学习的程序媛8 小时前
Python常用框架梳理
开发语言·后端·python·ai·web·后端框架·python框架
imgsq9 小时前
GESP Python 一到四级:备考路线与真题特点
python·青少年编程
Rabitebla9 小时前
【Linux】进程控制(十二) 自定义 Shell(二):内建命令与进程工作目录管理
linux·c++·笔记·学习·bash
Gary移动存储固件9 小时前
eMMC5.1协议中文学习讲解(6.6.17~6.6.22.4.6)
学习·ufs·emmc·nand·存储固件
一个天蝎座 白勺 程序猿10 小时前
别让收藏夹替你学习:我搭AI知识体系的完整方法,脚本直接拿去用
人工智能·学习·ai·ai学习
eggwyw10 小时前
Anaconda安装卸载的详细流程指南
开发语言·python