📜  排列(1)

📅  最后修改于: 2023-12-03 14:54:42.020000             🧑  作者: Mango

排列算法介绍

排列算法是指将一组元素按照一定的顺序重新排列的算法。常用的排列算法有冒泡排序、插入排序、快速排序、归并排序等。本文将分别介绍这些排序算法的具体实现和优缺点。

1. 冒泡排序

冒泡排序是一种基本的排序算法,它的基本思想是将相邻的两个元素进行比较,如果顺序不对,就交换它们的位置,直到所有的元素都排好序为止。冒泡排序的时间复杂度为O(n^2),它的稳定性比较好。

def bubble_sort(lst):
    n = len(lst)
    for i in range(n):
        for j in range(n-i-1):
            if lst[j] > lst[j+1]:
                lst[j], lst[j+1] = lst[j+1], lst[j]
    return lst
2. 插入排序

插入排序的基本思想是将一个元素插入到已经排好序的有序序列中,从而得到一个新的、长度增加1的有序序列。插入排序的时间复杂度为O(n^2),它的稳定性比较好。

def insert_sort(lst):
    n = len(lst)
    for i in range(1, n):
        key = lst[i]
        j = i - 1
        while j >= 0 and key < lst[j]:
            lst[j+1] = lst[j]
            j -= 1
        lst[j+1] = key
    return lst
3. 快速排序

快速排序是基于分治的思想实现的排序算法,它的基本思路是选择一个基准元素,将数组分成两个部分,左边的部分的元素都小于基准元素,右边的部分的元素都大于基准元素,然后递归地对左右两个部分进行排序。快速排序的时间复杂度为O(nlogn),但是在最坏的情况下(当基准元素选择不当时),快速排序的时间复杂度会退化为O(n^2)。

def quick_sort(lst):
    if len(lst) <= 1:
        return lst
    pivot = lst[0]
    left = []
    right = []
    for i in range(1, len(lst)):
        if lst[i] < pivot:
            left.append(lst[i])
        else:
            right.append(lst[i])
    return quick_sort(left) + [pivot] + quick_sort(right)
4. 归并排序

归并排序是一种分治算法,它的基本思想是将数组分成两个部分,分别对这两个部分进行排序,然后将这两个有序的部分归并成一个有序的数组。归并排序的时间复杂度为O(nlogn),它的稳定性比较好。

def merge_sort(lst):
    if len(lst) <= 1:
        return lst
    mid = len(lst) // 2
    left = merge_sort(lst[:mid])
    right = merge_sort(lst[mid:])
    i = j = 0
    merge_lst = []
    while i < len(left) and j < len(right):
        if left[i] < right[j]:
            merge_lst.append(left[i])
            i += 1
        else:
            merge_lst.append(right[j])
            j += 1
    merge_lst += left[i:]
    merge_lst += right[j:]
    return merge_lst
总结

以上就是常用的排列算法的介绍和实现。每种算法有其优缺点,如快速排序在处理大数据时比较快,但在处理小数据时则不如插入排序。因此,在实际应用中应根据具体情况选择不同的排序算法。