算法修炼笔记1 | 排序算法

80 阅读2分钟

排序算法之冒泡排序

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

以下是对代码的详细解释:

  • def bubble_sort(arr)::定义一个名为 bubble_sort的函数,它接受一个列表 arr 作为参数。
  • length = len(arr):初始化一个变量 length,它表示列表的长度。
  • for index in range(length)::这是外层循环,遍历整个列表。
  • for i in range(1, length - index)::这是内层循环,它从第二个元素开始,一直遍历到列表的末尾减去当前外层循环的索引。这是因为每次外层循环后,列表的最后 index个元素已经排好序了,所以不需要再比较。
  • if arr[i - 1] > arr[i]::如果当前元素比它的前一个元素大,就交换它们的位置。
  • arr[i - 1], arr[i] = arr[i], arr[i - 1]:交换元素位置,确保较大的元素向后移动。
  • return arr:排序完成后,函数返回排序后的列表。

总的来说,冒泡排序算法通过多次比较和交换相邻元素的方式,将列表中的元素按照升序排列。这段代码的时间复杂度为 O(n^2),其中 n 是列表的长度,因为它需要两层嵌套循环来比较元素。尽管它不是最有效的排序算法,但它在小型数据集上表现良好。

排序算法之快速排序

def quick_sort(arr):
    if len(arr) <= 1:
        return arr
    length = len(arr)
    pivot = arr[length // 2]
    
    left = [x for x in arr if x < piovt]
    middle = [x for x in arr if x == pivot]
    right = [x for x in arr if x > right]
    
    return quick_sort(left) + middle + quick_sort(right)

以下是对代码的详细解释:

  • def quick_sort(arr)::定义一个名为 quick_sort 的函数,它接受一个列表 arr 作为参数。
  • if len(arr) <= 1: return arr:这是一个基本情况检查。如果列表为空或只有一个元素,它已经排序好了,所以直接返回该列表。
  • length = len(arr):获取列表的长度。
  • pivot = arr[length // 2]:选择列表中间的元素作为基准值(pivot)。
  • left = [x for x in arr if x < pivot]:创建一个新的列表 left,其中包含所有小于基准值的元素。
  • middle = [x for x in arr if x == pivot]:创建一个新的列表 middle,其中包含所有等于基准值的元素。
  • right = [x for x in arr if x > pivot]:创建一个新的列表 right,其中包含所有大于基准值的元素。
  • return quick_sort(left) + middle + quick_sort(right):递归地对 left 和 right 列表进行快速排序,并将结果与 middle 列表拼接在一起返回。最终得到的是一个排序后的列表。

这种算法的平均时间复杂度是 O(nlogn),其中 n 是列表的长度。快速排序在实践中非常高效,尤其是在处理大型数据集时。