七大排序算法详解与实现

七大排序算法的基本原理

冒泡排序(Bubble Sort)

冒泡排序通过重复地遍历待排序的列表,比较相邻的元素并交换它们的位置来实现排序。每一轮遍历会将当前未排序部分的最大元素“冒泡”到正确的位置。

时间复杂度:

  • 最优情况:$O(n)$(列表已经有序)
  • 最坏情况:$O(n^2)$(列表完全逆序)
  • 平均情况:$O(n^2)$

空间复杂度:$O(1)$(原地排序)

def bubble_sort(arr):
    n = len(arr)
    for i in range(n):
        swapped = False
        for j in range(0, n-i-1):
            if arr[j] > arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]
                swapped = True
        if not swapped:
            break

选择排序(Selection Sort)

选择排序每次从未排序部分选择最小(或最大)的元素,将其放到已排序部分的末尾。它是一种不稳定的排序算法。

时间复杂度:

  • 最优、最坏和平均情况均为 $O(n^2)$

空间复杂度:$O(1)$

def selection_sort(arr):
    n = len(arr)
    for i in range(n):
        min_idx = i
        for j in range(i+1, n):
            if arr[j] < arr[min_idx]:
                min_idx = j
        arr[i], arr[min_idx] = arr[min_idx], arr[i]

插入排序(Insertion Sort)

插入排序通过构建有序序列,逐步将未排序部分的元素插入到已排序部分的适当位置。对于小规模或基本有序的数据效率较高。

时间复杂度:

  • 最优情况:$O(n)$(列表已经有序)
  • 最坏情况:$O(n^2)$(列表完全逆序)
  • 平均情况:$O(n^2)$

空间复杂度:$O(1)$

def insertion_sort(arr):
    n = len(arr)
    for i in range(1, n):
        key = arr[i]
        j = i-1
        while j >=0 and key < arr[j]:
            arr[j+1] = arr[j]
            j -= 1
        arr[j+1] = key

归并排序(Merge Sort)

归并排序采用分治法,将列表分成两半,递归排序后再合并。它是一种稳定的排序算法。

时间复杂度:

  • 最优、最坏和平均情况均为 $O(n \log n)$

空间复杂度:$O(n)$(需要额外的存储空间)

def merge_sort(arr):
    if len(arr) > 1:
        mid = len(arr)//2
        L = arr[:mid]
        R = arr[mid:]
        merge_sort(L)
        merge_sort(R)
        i = j = k = 0
        while i < len(L) and j < len(R):
            if L[i] < R[j]:
                arr[k] = L[i]
                i += 1
            else:
                arr[k] = R[j]
                j += 1
            k += 1
        while i < len(L):
            arr[k] = L[i]
            i += 1
            k += 1
        while j < len(R):
            arr[k] = R[j]
            j += 1
            k += 1

快速排序(Quick Sort)

快速排序通过选择一个“基准”元素,将列表分为小于基准和大于基准的两部分,再递归排序这两部分。它是一种高效的排序算法,但不稳定。

时间复杂度:

  • 最优和平均情况:$O(n \log n)$
  • 最坏情况:$O(n^2)$(当基准选择不当时)

空间复杂度:$O(\log n)$(递归调用栈)

def quick_sort(arr, low, high):
    if low < high:
        pi = partition(arr, low, high)
        quick_sort(arr, low, pi-1)
        quick_sort(arr, pi+1, high)

def partition(arr, low, high):
    pivot = arr[high]
    i = low - 1
    for j in range(low, high):
        if arr[j] < pivot:
            i += 1
            arr[i], arr[j] = arr[j], arr[i]
    arr[i+1], arr[high] = arr[high], arr[i+1]
    return i+1

堆排序(Heap Sort)

堆排序利用堆数据结构,将列表构建为大顶堆或小顶堆,再逐步取出堆顶元素完成排序。它是一种不稳定的排序算法。

时间复杂度:

  • 最优、最坏和平均情况均为 $O(n \log n)$

空间复杂度:$O(1)$

def heapify(arr, n, i):
    largest = i
    l = 2 * i + 1
    r = 2 * i + 2
    if l < n and arr[i] < arr[l]:
        largest = l
    if r < n and arr[largest] < arr[r]:
        largest = r
    if largest != i:
        arr[i], arr[largest] = arr[largest], arr[i]
        heapify(arr, n, largest)

def heap_sort(arr):
    n = len(arr)
    for i in range(n//2 - 1, -1, -1):
        heapify(arr, n, i)
    for i in range(n-1, 0, -1):
        arr[i], arr[0] = arr[0], arr[i]
        heapify(arr, i, 0)

计数排序(Counting Sort)

计数排序通过统计每个元素的出现次数,直接确定元素在输出数组中的位置。它是一种非比较排序算法,适用于整数数据且范围较小的情况。

时间复杂度:

  • 最优、最坏和平均情况均为 $O(n + k)$($k$ 是数据范围)

空间复杂度:$O(n + k)$

def counting_sort(arr):
    max_val = max(arr)
    min_val = min(arr)
    range_val = max_val - min_val + 1
    count = [0] * range_val
    output = [0] * len(arr)
    for num in arr:
        count[num - min_val] += 1
    for i in range(1, len(count)):
        count[i] += count[i-1]
    for num in reversed(arr):
        output[count[num - min_val] - 1] = num
        count[num - min_val] -= 1
    return output

总结

七大排序算法各有特点:

  • 冒泡排序、选择排序、插入排序适合小规模数据或教学演示。
  • 归并排序、快速排序、堆排序适合大规模数据,时间复杂度为 $O(n \log n)$。
  • 计数排序适用于特定场景(如整数且范围较小)。

根据数据规模、稳定性和内存限制选择合适的算法。

BbS.okacop010.info/PoSt/1120_752443.HtM
BbS.okacop011.info/PoSt/1120_271416.HtM
BbS.okacop012.info/PoSt/1120_938035.HtM
BbS.okacop013.info/PoSt/1120_386142.HtM
BbS.okacop014.info/PoSt/1120_975930.HtM
BbS.okacop015.info/PoSt/1120_896431.HtM
BbS.okacop016.info/PoSt/1120_244264.HtM
BbS.okacop017.info/PoSt/1120_756980.HtM
BbS.okacop018.info/PoSt/1120_717229.HtM
BbS.okacop019.info/PoSt/1120_046442.HtM
BbS.okacop010.info/PoSt/1120_097143.HtM
BbS.okacop011.info/PoSt/1120_151244.HtM
BbS.okacop012.info/PoSt/1120_425306.HtM
BbS.okacop013.info/PoSt/1120_849256.HtM
BbS.okacop014.info/PoSt/1120_340015.HtM
BbS.okacop015.info/PoSt/1120_560684.HtM
BbS.okacop016.info/PoSt/1120_897492.HtM
BbS.okacop017.info/PoSt/1120_598994.HtM
BbS.okacop018.info/PoSt/1120_894801.HtM
BbS.okacop019.info/PoSt/1120_970783.HtM
BbS.okacop010.info/PoSt/1120_979588.HtM
BbS.okacop011.info/PoSt/1120_358342.HtM
BbS.okacop012.info/PoSt/1120_781869.HtM
BbS.okacop013.info/PoSt/1120_553555.HtM
BbS.okacop014.info/PoSt/1120_809833.HtM
BbS.okacop015.info/PoSt/1120_530348.HtM
BbS.okacop016.info/PoSt/1120_801880.HtM
BbS.okacop017.info/PoSt/1120_073939.HtM
BbS.okacop018.info/PoSt/1120_289418.HtM
BbS.okacop019.info/PoSt/1120_299878.HtM
BbS.okacop010.info/PoSt/1120_134824.HtM
BbS.okacop011.info/PoSt/1120_194771.HtM
BbS.okacop012.info/PoSt/1120_118109.HtM
BbS.okacop013.info/PoSt/1120_643304.HtM
BbS.okacop014.info/PoSt/1120_271274.HtM
BbS.okacop015.info/PoSt/1120_598606.HtM
BbS.okacop016.info/PoSt/1120_439622.HtM
BbS.okacop017.info/PoSt/1120_301077.HtM
BbS.okacop018.info/PoSt/1120_058354.HtM
BbS.okacop019.info/PoSt/1120_514682.HtM
BbS.okacop010.info/PoSt/1120_993222.HtM
BbS.okacop011.info/PoSt/1120_852269.HtM
BbS.okacop012.info/PoSt/1120_224904.HtM
BbS.okacop013.info/PoSt/1120_701616.HtM
BbS.okacop014.info/PoSt/1120_465617.HtM
BbS.okacop015.info/PoSt/1120_814894.HtM
BbS.okacop016.info/PoSt/1120_482508.HtM
BbS.okacop017.info/PoSt/1120_045358.HtM
BbS.okacop018.info/PoSt/1120_852482.HtM
BbS.okacop019.info/PoSt/1120_836008.HtM
BbS.okacop010.info/PoSt/1120_130949.HtM
BbS.okacop011.info/PoSt/1120_690366.HtM
BbS.okacop012.info/PoSt/1120_530520.HtM
BbS.okacop013.info/PoSt/1120_832170.HtM
BbS.okacop014.info/PoSt/1120_986600.HtM
BbS.okacop015.info/PoSt/1120_456313.HtM
BbS.okacop016.info/PoSt/1120_171682.HtM
BbS.okacop017.info/PoSt/1120_167018.HtM
BbS.okacop018.info/PoSt/1120_394521.HtM
BbS.okacop019.info/PoSt/1120_547832.HtM
BbS.okacop010.info/PoSt/1120_380639.HtM
BbS.okacop011.info/PoSt/1120_971815.HtM
BbS.okacop012.info/PoSt/1120_224633.HtM
BbS.okacop013.info/PoSt/1120_030484.HtM
BbS.okacop014.info/PoSt/1120_207083.HtM
BbS.okacop015.info/PoSt/1120_733311.HtM
BbS.okacop016.info/PoSt/1120_958013.HtM
BbS.okacop017.info/PoSt/1120_643834.HtM
BbS.okacop018.info/PoSt/1120_115540.HtM
BbS.okacop019.info/PoSt/1120_038688.HtM
BbS.okacop010.info/PoSt/1120_234887.HtM
BbS.okacop011.info/PoSt/1120_560421.HtM
BbS.okacop012.info/PoSt/1120_082561.HtM
BbS.okacop013.info/PoSt/1120_973500.HtM
BbS.okacop014.info/PoSt/1120_769849.HtM
BbS.okacop015.info/PoSt/1120_222105.HtM
BbS.okacop016.info/PoSt/1120_897240.HtM
BbS.okacop017.info/PoSt/1120_787240.HtM
BbS.okacop018.info/PoSt/1120_387886.HtM
BbS.okacop019.info/PoSt/1120_971698.HtM

#牛客AI配图神器#

全部评论

相关推荐

10-09 17:17
已编辑
门头沟学院 Java
活泼的代码渣渣在泡池...:同学你好,我也是学院本,后天要面这个亚信科技,是实习,请问问题都啥样呀,我项目就做了网上的,这是第一次面试
投递多益网络等公司10个岗位
点赞 评论 收藏
分享
09-23 14:45
贵州大学 财务
你真的不如他呢:才四家,四十家再说吧
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务