十大排序算法总结

在这里插入图片描述

1、插入排序

遍历列表的第二个元素到最后一个元素,每次拿后面的元素与前面的元素做比较找到合适的插入位置采用一个for循环套一个while循环实现。
在这里插入图片描述

def generate(A):
    for j in range(1, len(A)):
        key = A[j]
        i = j - 1
        while i >= 0 and A[i] > key:  # T
            A[i + 1] = A[i]
            i = i - 1
        A[i + 1] = key
    return A

print(generate([5, 2, 4, 6, 1, 3]))

2、选择排序

首先找出最小的元素与A[0]交换,再找出第二小的元素与A[1]交换,依次类推每次找出剩下元素中最小的元素。

def generate(A):
    k = 0
    while k < len(A):
        MIN = A.index(min(A[k::]))
        A[k], A[MIN] = A[MIN], A[k]
        k += 1
    return A

3、冒泡排序

元素从左至右两两循环,将小的元素放在前面,采用双重for循环实现
在这里插入图片描述

"""将最大值顶到最后端"""
def bubble_sort(A):
    for i in range(len(A)-1,-1,-1):
        for j in range(i):
            if A[j] > A[j + 1]:
                A[j], A[j + 1] = A[j + 1], A[j]
    return A

"""将最小值顶到最前端"""
def bubble_sort(A):
    for i in range(len(A) - 1):
        for j in range(len(A) - 1, i, -1):
            if A[j] < A[j - 1]:
                A[j], A[j - 1] = A[j - 1], A[j]
    return A

4、归并排序

分函数将待排元素依次划分为左半部分和右半部分直到元素个数为1,然后合函数再依次合并左半部分和右半部分。
在这里插入图片描述

def merge(A, p, q, r):
    n_1 = q - p + 1
    n_2 = r - q
    L = [0] * (n_1 + 1)
    R = [0] * (n_2 + 1)
    for i in range(n_1):
        L[i] = A[p + i]
    for j in range(n_2):
        R[j] = A[q + 1 + j]
    L[n_1] = float("inf")
    R[n_2] = float("inf")
    i = 0
    j = 0
    for k in range(p, r + 1):
        if L[i] < R[j]:
            A[k] = L[i]
            i += 1
        else:
            A[k] = R[j]
            j += 1


def merge_sort(A, p, r):
    if p < r:
        q = (p + r) // 2
        merge_sort(A, p, q)
        merge_sort(A, q+1, r)
        merge(A, p, q, r)
    return A

5、快速排序

每次选择一个基准值,将小于基准值的元素放在基准值左边,大于基准值的元素放在基准值右边。
在这里插入图片描述

"""快速排序"""
def QUICK_sort(A, p, r):
    if p < r:
        q = PARTITION(A, p, r)
        QUICK_sort(A, p, q - 1)
        QUICK_sort(A, q + 1, r)
    return A


def PARTITION(A, p, r):
    key = A[r]
    i = p - 1
    for j in range(p, r):
        if A[j] <= key:
            i += 1
            A[i], A[j] = A[j], A[i]
    A[i + 1], A[r] = A[r], A[i + 1]
    return i + 1

6、堆排序

构建堆,将堆的A[0]元素依次和堆的最后一个元素交换位置,然后维护对A[0,len(A)-1]维护堆的性质,一直到。
在这里插入图片描述

"""堆排序,最大根"""
def PARENT(i):
    return i // 2


def LEFT(i):
    return 2 * i + 1


def Right(i):
    return 2 * i + 2


def MAX_HEAPIFY(A, i):
    l = LEFT(i)
    r = Right(i)
    if l < len(A) and A[l] > A[i]:
        largest = l
    else:
        largest = i
    if r < len(A) and A[r] > A[largest]:
        largest = r
    if largest != i:
        A[i], A[largest] = A[largest], A[i]
        MAX_HEAPIFY(A, largest)
    return A


def BUILD_HEAP(A):
    for i in range(len(A) // 2, -1, -1):
        A = MAX_HEAPIFY(A, i)
    return A


def HEAP_sort(A):
    A = BUILD_HEAP(A)
    for i in range(len(A) - 1, 0, -1):
        A[0], A[i] = A[i], A[0]
        A[0:i] = MAX_HEAPIFY(A[0:i], 0)
    return A
"""python内置函数法"""
import heapq
def HEAP_sort(A):
    h = []
    for items in A:
        heapq.heappush(h, items)
    return [heapq.heappop(h) for _ in range(len(A))]

7、计数排序

思想:对于每一个输入元素 x x x, 确定小于 x x x的元素的个数,利用这一信息就可以直接把 x x x放到他在输出数组中的位置。
在这里插入图片描述

"""计数排序"""
"""适用于整数,有重复元素的情况"""
import numpy as np
def counting_sort(A):
    if len(A) < 2:
        return len(A)
    MAX = max(A)
    MIN = min(A)
    C = [0] * (MAX - MIN + 1)
    B = [0] * (len(A))
    for i in range(len(A)):
        C[A[i]] += 1
    C = np.cumsum(C)
    for i in range(len(A) - 1, -1, -1):
        B[C[A[i]]-1] = A[i]
        C[A[i]] -= 1
    return B

8、基数排序

依次按照从最低有效位到最高有效位进行排序(排序方法选择计数排序)。
在这里插入图片描述

"""基数排序"""
"""适用于整数,有重复元素"""
def Radix_sort(A):
    n = len(str(max(A)))  # 获取最大元素的位数
    for k in range(n):
        bucket_list = [[] for i in range(10)]
        for i in A:
            bucket_list[i // (10 ** k) % 10].append(i)
        A = []
        for i in bucket_list:
            for j in i:
                A.append(j)
    return A

9、桶排序

将元素划分到若干个桶里,然后对每个桶的元素进行排序(采用插入排序即可)。
在这里插入图片描述

"""桶排序"""
def Insertion_sort(A):
    if len(A) < 2:
        return A
    for i in range(1, len(A)):
        key = A[i]
        j = i - 1
        while j >= 0 and A[j] > key:
            A[j + 1] = A[j]
            j -= 1
        A[j + 1] = key
    return A


def Bucket_sort(A):
    n = len(A)
    Bucket = [[] for i in range(n)]
    for i in range(n):
        Bucket[int(n * A[i])].append(A[i])
    RES = []
    for j in Bucket:
        if j:
            j = Insertion_sort(j)
            for num in range(len(j)):
                RES.append(j[num])
    return RES

10、希尔排序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值