📜  快速排序与归并排序(1)

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

快速排序与归并排序

快速排序与归并排序均是常见的、高效的排序算法,效率取决于具体实现方式。本文将介绍两种排序算法的原理、优缺点、实现方式以及时间复杂度等。

快速排序

快速排序采用了分治法(Divide and Conquer)的思想,将要排序的数组分成两个部分(sub-lists),其中一个部分的所有元素比另一部分的所有元素小,则可采用递归的方式将两个部分分别进行排序。

基本思路
  • 首先选出一个值作为基准值(pivot),可以随便选一个数
  • 将数组中小于等于基准值的数都放到基准值的左边,大于基准值的数放到基准值的右边
  • 对于左边和右边的子数组,分别递归地进行上述操作,直到每个子数组只有一个元素为止
代码实现
def quick_sort(array):
    if len(array) < 2:
        return array
    else:
        pivot = array[0]
        less = [x for x in array[1:] if x <= pivot]
        greater = [x for x in array[1:] if x > pivot]
        return quick_sort(less) + [pivot] + quick_sort(greater)
时间复杂度

在平均情况下,快速排序的时间复杂度为O(nlogn),但最坏情况下时间复杂度为O(n^2)。

归并排序

归并排序也是一种采用分治思想的排序算法。它的思路是将待排序的数组分成若干个子数组,每个子数组都是有序的,然后再将前面排好序的子数组合并成一个大的有序数组。

基本思路
  • 如果数组只有一个元素,就不需要排序,直接返回该数组
  • 分割操作:将数组从中点分为两个部分,分别递归地对左侧部分和右侧部分进行归并排序
  • 合并操作:将两个有序数组合并成一个大的有序数组
代码实现
def merge_sort(array):
    if len(array) < 2:
        return array
    else:
        mid = len(array) // 2
        left = merge_sort(array[:mid])
        right = merge_sort(array[mid:])
        return merge(left, right)
    
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
时间复杂度

归并排序的时间复杂度为O(nlogn),是一种稳定的排序算法。

总结
  • 快速排序的平均效率比归并排序高,但最坏情况下性能会非常差。
  • 归并排序是一种稳定的排序算法,不受输入数据的影响,但需要额外的存储空间来合并两个有序数组。