快速排序 vs 归并排序:有什么区别?

2025年4月19日 | 阅读 9 分钟

排序是指将集体数据按特定格式(如升序或降序)排列。通常,它用于以排序的方式排列同类数据。使用排序算法,我们可以按顺序排列数据,并轻松快速地搜索元素。排序技术取决于两种情况,即执行程序所需的总时间和总空间。在本节中,我们将讨论快速排序归并排序,并对它们进行比较。

Quick Sort vs Merge Sort

快速排序

快速排序是一种基于比较的排序算法,它遵循分治技术来排序数组。在快速排序中,我们通常使用枢轴(键)元素来根据某些条件比较和交换元素的位置。当枢轴元素在数组中获得固定位置时,这表明比较和交换过程已终止。之后,数组被分成两个子数组。第一个分区包含所有小于枢轴(键)元素的元素,而另一个分区包含所有大于枢轴元素的元素。之后,它再次在每个子数组中选择一个枢轴元素,并重复相同的过程,直到数组中的所有元素都被排序为止。

快速排序算法

Partition (A, p, r)

  1. X <- A[r]
  2. I <- p-1
  3. For j <- p to r -1
  4. Do if A[j] <= x
  5. Then I <- I + 1
  6. Exchange A[i] <-> A[j]
  7. Exchange A[I + 1] <--> A[r]
  8. Return I + 1

Quicksort (A, p, r)

  1. While (p < r)
  2. Do q <- Partition (A, p, r)
  3. R <- q-1
  4. While (p < r)
  5. Do q <- Partition (A, p, r)
  6. P <- q + 1

使用快速排序算法对数组进行排序的步骤

假设我们有一个包含元素 X[1], X[2], X[3], ... , X[n] 的数组 X 需要进行排序。让我们按照以下步骤使用快速排序对数组进行排序。

步骤 1:将数组的第一个元素设置为枢轴或键元素。此处,我们假设枢轴为 X[0],指针指向第一个元素,指针指向数组元素的最后一个索引。

步骤 2:现在我们从右侧索引开始扫描数组元素,然后

如果 X[key] 小于 X[right] 或如果 X[key] < X[Right],

  1. 持续减小右端指针变量,直到它等于键。
  2. 如果 X[key] > X[right],则交换键元素与 X[right] 元素的位置。
  3. 设置 key = right,并将左索引加 1。

步骤 3:现在我们再次从左侧开始扫描元素,并将每个元素与键元素进行比较。X[key] > X[left] 或 X[key] 大于 X[left],则执行以下操作

  1. 持续将左元素与 X[key] 进行比较,并将左索引加 1,直到键等于左。
  2. 如果 X[key] < X[left],则交换 X[key] 与 X[left] 的位置,然后转到步骤 2。

步骤 4:重复步骤 2 和 3,直到 X[left] 等于 X[key]。因此,我们可以说,如果 X[left] = X[key],则表示过程终止。

步骤 5:之后,左侧的所有元素都将小于键元素,而右侧的其余元素都将大于键元素。这表明需要将数组划分为两个子数组。

步骤 6:类似地,我们需要对子数组重复执行上述过程,直到整个数组排序完成。

让我们看一个快速排序的例子。

示例:考虑一个包含 6 个元素的数组。使用快速排序对数组进行排序。

arr[] = {50, 20, 60, 30, 40, 56}

Quick Sort vs Merge Sort

在上面的数组中,50 处于其正确的位置。因此,我们将小于枢轴的元素分成一个子数组,将大于枢轴元素的元素分成另一个子数组。

Quick Sort vs Merge Sort

因此,我们得到了排序后的数组。

让我们用 C 语言实现上述逻辑。

Quick.c

输出

Sorted Array is:
Array = 50  20  60  30  40  56 

归并排序

归并排序是最重要的排序技术之一,它基于分治策略。它是用于排序文件中可用数据的最流行的排序技术。归并排序算法将给定数组分成两半(N/2)。然后,它递归地将两个子数组的元素集分成单个或单个元素,或者我们可以说直到无法再分割为止。之后,它比较相应元素以对元素进行排序,最后,将所有子元素合并以形成最终排序的元素。

使用归并排序算法对数组进行排序的步骤

  1. 假设我们有一个给定的数组,那么首先我们需要将数组分成子数组。每个子数组可以存储 5 个元素。
  2. 这里我们将第一个子数组命名为 A1,并将其分成接下来的两个子数组 B1 和 B2。
  3. 类似地,右子数组命名为 A2,并将其分成接下来的两个子数组 B3 和 B4。
  4. 此过程将持续重复,直到子数组被分割成单个元素且不再可能进行分区。
  5. 之后,比较每个元素与对应的元素,然后开始合并过程,将每个元素以升序排列。
  6. 合并过程将继续,直到所有元素都按升序合并。

让我们看一个归并排序的例子。

示例:考虑一个包含 9 个元素的数组。使用归并排序对数组进行排序。

arr[] = {70, 80, 40, 50, 60, 11, 35, 85, 2}

Quick Sort vs Merge Sort

因此,我们使用归并排序得到了排序后的数组。

让我们用 C 语言实现上述逻辑。

Merge.c

输出

Predefined Array is
70      80      40      50      60      11      35      85      2

 Sorted array using the Merge Sort algorithm
2       11      35      40      50      60      70      80      85

快速排序 vs. 归并排序

序号参数快速排序合并排序
1.定义它是一种快速排序算法,通过比较和交换元素位置来将给定元素按升序排列。它是一种归并排序算法,它使用分治技术将给定元素集按升序排列,然后与相应元素进行比较以排序数组。
2.原则它基于分治技术。它基于分治技术。
3.元素分区在快速排序中,数组可以按任意比例分割。归并排序将数组分割成两个子数组(N/2)。
4.效率与归并排序相比,它在较小的数组上更有效率,速度更快。与快速排序相比,它在较大的数据集或数组上更有效率,速度更快。
5排序方法它是一种内部排序方法,用于对主内存中的数组或数据进行排序。它是一种外部排序方法,用于对外部文件中的数组或数据集进行排序。
6时间复杂度其最坏时间复杂度为 O (n2)。而其最坏时间复杂度为 O (n log n)。
7推荐它是一种适用于大型未排序数组的排序算法。而归并排序算法则更适合排序链表。
8稳定性快速排序是一种不稳定的排序算法。但我们可以通过对编程代码进行一些更改使其稳定。归并排序是一种稳定的排序算法,在排序输出中,两个具有相同值的相等元素会保持其相对顺序。
9所需空间它不需要任何额外的空间来执行快速排序。它需要额外的空间作为临时数组来合并两个子数组。
10.功能比较每个元素与枢轴,直到所有元素都按升序排列。而归并排序将数组分成两部分(N/2),并持续分割数组直到只剩一个元素。
13.缓存效率快速排序算法由于其原地分区过程,因此显示出更好的缓存性能。归并排序需要额外的空间来合并元素,这可能导致更多的缓存未命中。这会影响其缓存效率,尤其是在处理大型数组时。
14.实际中的稳定性虽然快速排序在技术上可能被认为是不稳定的,但在实际应用中,这种不稳定性很少引起问题。归并排序的稳定性是一个重要特性,它确保相等元素保持其原始顺序。
15.编程复杂度由于快速排序的递归性质和原地分区,其实现可能相对简单。这使得它非常容易编写代码。归并排序是一种高效的排序算法,但其实现可能涉及更复杂的编程。尤其是在合并已排序的小数组和管理所需的额外内存空间时。尽管存在这种复杂性,归并排序仍然是组织大型数据集的有力工具。

下一个主题bfs-和-dfs-的区别