返回

排序算法及其Python实现

闲谈

前言

在计算机科学中,排序算法是指对一组数据进行排序的操作,使之满足一定的顺序,例如升序或降序。排序算法在数据处理和分析领域有着广泛的应用,如查找最大值或最小值、数据压缩和数据库查询等。

常用排序算法

1. 插入排序

插入排序是一种简单直观的排序算法。它的基本思想是将一个待排序的数据元素插入到已经排好序的序列中,直到所有元素都按顺序排列。插入排序适用于小规模的数据排序,时间复杂度为O(n^2),空间复杂度为O(1)。

Python代码如下:

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

2. 选择排序

选择排序是一种简单有效的排序算法。它的基本思想是每次从待排序的数据元素中选择一个最小或最大的元素,然后将其与待排序序列中的第一个或最后一个元素交换,依次类推,直到所有元素都按顺序排列。选择排序的时间复杂度为O(n^2),空间复杂度为O(1)。

Python代码如下:

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

3. 冒泡排序

冒泡排序是一种简单直观的排序算法。它的基本思想是反复比较相邻的两个元素,如果顺序不正确,则交换它们,直到所有元素都按顺序排列。冒泡排序的时间复杂度为O(n^2),空间复杂度为O(1)。

Python代码如下:

def bubble_sort(arr):
    for i in range(len(arr) - 1):
        for j in range(len(arr) - i - 1):
            if arr[j] > arr[j + 1]:
                arr[j], arr[j + 1] = arr[j + 1], arr[j]
    return arr

4. 快速排序

快速排序是一种高效的排序算法。它的基本思想是将待排序的数据元素分成两部分,一部分比基准元素小,另一部分比基准元素大,然后递归地对这两部分进行排序。快速排序的时间复杂度为O(nlogn),空间复杂度为O(logn)。

Python代码如下:

def quick_sort(arr):
    if len(arr) <= 1:
        return arr

    pivot = arr[len(arr) // 2]
    left = [x for x in arr if x < pivot]
    middle = [x for x in arr if x == pivot]
    right = [x for x in arr if x > pivot]

    return quick_sort(left) + middle + quick_sort(right)

5. 归并排序

归并排序是一种稳定的排序算法。它的基本思想是将待排序的数据元素分成两部分,然后递归地对这两部分进行排序,最后合并两个有序的子序列。归并排序的时间复杂度为O(nlogn),空间复杂度为O(n)。

Python代码如下:

def merge_sort(arr):
    if len(arr) <= 1:
        return arr

    mid = len(arr) // 2
    left = merge_sort(arr[:mid])
    right = merge_sort(arr[mid:])

    return merge(left, right)

def merge(left, right):
    merged = []
    left_idx = right_idx = 0

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

    merged.extend(left[left_idx:])
    merged.extend(right[right_idx:])

    return merged

6. 桶排序

桶排序是一种非比较排序算法。它的基本思想是将待排序的数据元素分配到一定数量的桶中,然后对每个桶中的数据元素进行排序,最后将各个桶中的数据元素按顺序输出。桶排序的时间复杂度为O(n+k),其中n是数据元素的个数,k是桶的个数。

Python代码如下:

def bucket_sort(arr, k):
    buckets = [[] for _ in range(k)]

    for num in arr:
        bucket_idx = num // k
        buckets[bucket_idx].append(num)

    for bucket in buckets:
        bucket.sort()

    sorted_arr = []
    for bucket in buckets:
        sorted_arr.extend(bucket)

    return sorted_arr

7. 计数排序

计数排序是一种非比较排序算法。它的基本思想是将待排序的数据元素的每个可能的取值都映射到一个计数数组中,然后根据计数数组中的值来确定每个数据元素的最终位置。计数排序的时间复杂度为O(n+k),其中n是数据元素的个数,k是数据元素的取值范围。

Python代码如下:

def counting_sort(arr, k):
    count_arr = [0 for _ in range(k + 1)]

    for num in arr:
        count_arr[num] += 1

    for i in range(1, k + 1):
        count_arr[i] += count_arr[i - 1]

    sorted_arr = [0 for _ in range(len(arr))]
    i = len(arr) - 1

    while i >= 0:
        num = arr[i]
        sorted_arr[count_arr[num] - 1] = num
        count_arr[num] -= 1
        i -= 1

    return sorted_arr

8. 基数排序

基数排序是一种非比较排序算法。它的基本思想是将待排序的数据元素按照某一位数的大小进行排序,然后按照下一位数的大小进行排序,依次类推,直到所有位数都排序完成。基数排序的时间复杂度为O(nk),其中n是数据元素的个数,k是数据元素的位数。

Python代码如下:

def radix_sort(arr, k):
    max_num = max(arr)
    exp = 1

    while max_num // exp > 0:
        counting_sort(arr, max_num // exp)
        exp *= 10

    return arr

结语

排序算法是计算机科学中的一个重要基础知识点,也是面试中经常被问到的问题。了解和掌握常用的排序算法,有助于我们更好地解决实际问题。