学习在Python中的泡沫排序、合并排序和快速排序

200 阅读4分钟

排序数据可能是你在程序中需要做的最常见的任务。作为许多不同在线应用程序的用户,你每天都在对数据进行排序。每一个购物网站都允许你对数据进行排序。例如,你可以按最低价格、最高价格、客户评论数量、平均评论分数等进行排序。不管是亚马逊、Target、Barnes n Noble,还是乐高商店,都无所谓。这一切都很容易做到,作为用户,我们所要做的就是点击一个链接,我们的数据就被排序了。排序问题已经解决了,所有现代编程语言都已经内置了排序逻辑,而且它们非常高效,所以你不需要实现你自己的排序算法。了解一些常见的排序技术的理论和应用确实有帮助,这就是我们现在要研究的。


泡沫排序

泡沫排序是要学习的第一个排序算法。你不可能在野外使用它,因为它不是很有效。然而,它很容易理解,而且是要学习的第一个排序例程。冒泡排序的开始是将前两个元素相互比较,看哪个更大。如果第一个元素比第二个元素大,那么这两个元素就会被调换。然后冒泡排序继续前进,对下两个元素做同样的操作。这个过程一直持续到数组中的所有项目都被检查过,而且最大的值已经全部移到了数组的右边(顶部)。然后,该算法重复整个过程,对所有元素进行操作,除了最后一个项目之前的元素,然后是之前的元素,以此类推,直到数组被完全排序。

这个可视化的过程就是下面代码例子的第一遍。

  • 更容易理解和实现
  • 性能不是很好。O(n2)
  • 其他排序算法的性能更高
  • 是一个很好的第一个学习的排序算法

泡沫排序的Python代码

def bubbleSort(data_to_sort):
    for i in range(len(data_to_sort) - 1, 0, -1):
        for j in range(i):
            if data_to_sort[j] > data_to_sort[j + 1]:
                temp = data_to_sort[j]
                data_to_sort[j] = data_to_sort[j + 1]
                data_to_sort[j + 1] = temp

        print(f'Iteration: {abs(i - len(data_to_sort))}', data_to_sort)


list_to_sort = [90, 50, 10, 20, 70, 60, 40, 30, 80]
print('Original List: ', list_to_sort)
bubbleSort(list_to_sort)
print('Sorted List: ', list_to_sort)
Original List:  [90, 50, 10, 20, 70, 60, 40, 30, 80]
Iteration: 1 [50, 10, 20, 70, 60, 40, 30, 80, 90]
Iteration: 2 [10, 20, 50, 60, 40, 30, 70, 80, 90]
Iteration: 3 [10, 20, 50, 40, 30, 60, 70, 80, 90]
Iteration: 4 [10, 20, 40, 30, 50, 60, 70, 80, 90]
Iteration: 5 [10, 20, 30, 40, 50, 60, 70, 80, 90]
Iteration: 6 [10, 20, 30, 40, 50, 60, 70, 80, 90]
Iteration: 7 [10, 20, 30, 40, 50, 60, 70, 80, 90]
Iteration: 8 [10, 20, 30, 40, 50, 60, 70, 80, 90]
Sorted List:  [10, 20, 30, 40, 50, 60, 70, 80, 90]


合并排序

合并排序是一种分而治之的算法,它把一个数组分成小块来操作。合并排序比冒泡排序有更好的性能。它的工作原理是连续地将一个数组分解,直到只剩下每个元素的单独数组。在这一点上,该算法开始将这些数组相互合并,直到原数组被重建为完全排序。

  • 分割和征服
  • 将数组分解成各个部分
  • 使用递归法对数据进行操作
  • 将这些碎片以排序的形式合并到阵列中去
  • 在大量的数据上有很好的性能

合并排序Python代码

def mergesort(data_to_sort):
    if len(data_to_sort) > 1:
        mid = len(data_to_sort) // 2
        leftarray = data_to_sort[:mid]
        rightarray = data_to_sort[mid:]

        mergesort(leftarray)
        mergesort(rightarray)

        i, j, k = 0, 0, 0

        while i < len(leftarray) and j < len(rightarray):
            if leftarray[i] < rightarray[j]:
                data_to_sort[k] = leftarray[i]
                i += 1
            else:
                data_to_sort[k] = rightarray[j]
                j += 1
            k += 1

        while i < len(leftarray):
            data_to_sort[k] = leftarray[i]
            i += 1
            k += 1

        while j < len(rightarray):
            data_to_sort[k] = rightarray[j]
            j += 1
            k += 1


list_to_sort = [90, 50, 10, 20, 70, 60, 40, 30, 80]
print('Original List: ', list_to_sort)
mergesort(list_to_sort)
print('Sorted List: ', list_to_sort)
Original List:  [90, 50, 10, 20, 70, 60, 40, 30, 80]
Sorted List:  [10, 20, 30, 40, 50, 60, 70, 80, 90]


快速排序

Quicksort也是一种分而治之的算法,它使用递归来完成其工作,通常比Merge Sort有更好的性能。Quicksort在现有数组中就地完成数据的排序。Quicksort的主要特点是选择一个支点。枢轴点用于开始对数组进行分区。分区过程的目的是移动位于支点值错误一侧的项目,并找出分割数组的点。在快速排序中,有一个下位索引和一个上位索引。开始时,只要下层索引小于上层索引,它就会递增,直到找到一个大于枢轴值的数值。然后,上层索引被递减,直到找到一个小于枢轴值的值,只要上层索引比下层索引大。当这两个索引相互交叉时,数组被分割。然后,枢轴值与上层索引互换,因此左边包含低于枢轴的值,右边包含高于枢轴的值。这个过程一直持续到数组不能再被分割为止。所有的排序逻辑都在快速排序的分割步骤中完成,数据被排序到位。

快速排序的Python代码

def quickSort(data_to_sort, first, last):
    if first < last:
        pivotindex = partition(data_to_sort, first, last)
        quickSort(data_to_sort, first, pivotindex - 1)
        quickSort(data_to_sort, pivotindex + 1, last)


def partition(values, first, last):
    pivotvalue = values[first]
    lower = first + 1
    upper = last
    done = False
    while not done:
        while lower <= upper and values[lower] <= pivotvalue:
            lower += 1
        while values[upper] >= pivotvalue and upper >= lower:
            upper -= 1
        if upper < lower:
            done = True
        else:
            temp = values[lower]
            values[lower] = values[upper]
            values[upper] = temp
    temp = values[first]
    values[first] = values[upper]
    values[upper] = temp
    return upper


list_to_sort = [90, 50, 10, 20, 70, 60, 40, 30, 80]
print('Original List: ', list_to_sort)
quickSort(list_to_sort, 0, len(list_to_sort) - 1)
print('Sorted List: ', list_to_sort)
Original List:  [90, 50, 10, 20, 70, 60, 40, 30, 80]
Sorted List:  [10, 20, 30, 40, 50, 60, 70, 80, 90]

Python中的泡沫排序、合并排序和快速排序 摘要

有许多算法可以对数据进行排序。我们看了一下在Python中实现的三种比较常见的算法。它们是泡沫排序、合并排序和快速排序。每一种都有与之相关的算法复杂性,以及不同程度的性能和易用性。