Python排序算法的稳定性分析

2023-04-16 00:00:00 算法 排序 稳定性

Python排序算法的稳定性指的是在排序过程中,对于相等的元素,在排序后是否仍保持其原来的相对位置不变。具体来说,如果两个相等的元素A和B,在原数列中A在B的前面,那么排序后,如果A仍在B的前面,则认为该排序算法是稳定的。如果不保持原来的相对位置,认为该排序算法是不稳定的。

以下是常见的Python排序算法的稳定性分析:

1.冒泡排序(Bubble Sort):稳定

冒泡排序是通过相邻元素的比较和交换来完成排序的,因为每次比较和交换只涉及相邻元素,所以它是稳定的排序算法。以下是一个示例代码:

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

# 测试示例
arr = [5, 2, 6, 1, 8, 4, 9, 3, 7]
bubble_sort(arr)
print(arr)  # [1, 2, 3, 4, 5, 6, 7, 8, 9]

2.插入排序(Insertion Sort):稳定

插入排序是将一个元素插入到已排好序的序列中,因为同等大小的元素在插入时会插到后面,所以插入排序是稳定的排序算法。以下是一个示例代码:

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

# 测试示例
arr = [5, 2, 6, 1, 8, 4, 9, 3, 7]
insertion_sort(arr)
print(arr)  # [1, 2, 3, 4, 5, 6, 7, 8, 9]

3.归并排序(Merge Sort):稳定

归并排序是将一个序列分成两个子序列,分别排序再合并的过程,因为合并的过程会保持相等元素的原有顺序,所以归并排序是稳定的排序算法。以下是一个示例代码:

def merge_sort(arr):
    def merge(left, right):
        result = []
        i, j = 0, 0
        while i < len(left) and j < len(right):
            if left[i] <= right[j]:
                result.append(left[i])
                i += 1
            else:
                result.append(right[j])
                j += 1
        result += left[i:]
        result += right[j:]
        return result

    if len(arr) <= 1:
        return arr

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

    return merge(left, right)

# 测试示例
arr = [5, 2, 6, 1, 8, 4, 9, 3, 7]
result = merge_sort(arr)
print(result)  # [1, 2, 3, 4, 5, 6, 7, 8, 9]

4.快速排序(Quick Sort):不稳定

快速排序是选择一个枢轴元素,将小于它的元素放到左边,大于它的元素放到右边,之后递归地对左右子集进行快速排序。快速排序不保证相等大小的元素在排序前和排序后的相对位置不变,所以是不稳定的。以下是一个示例代码:

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

    pivot = arr[0]
    less = [ele for ele in arr[1:] if ele <= pivot]
    greater = [ele for ele in arr[1:] if ele > pivot]

    return quick_sort(less) + [pivot] + quick_sort(greater)

# 测试示例
arr = [5, 2, 6, 1, 8, 4, 9, 3, 7]
result = quick_sort(arr)
print(result)  # [1, 2, 3, 4, 5, 6, 7, 8, 9]

综上可知,冒泡排序、插入排序、归并排序是稳定的排序算法,而快速排序是不稳定的排序算法。所以,在需要保持相同元素的相对位置不变的情况下,应该优先考虑使用稳定的排序算法。

相关文章