返回

用生动形象的例子,让您理解快速排序的奥秘:探索快速排序之妙处

前端

在浩瀚的算法世界里,快速排序犹如一颗闪耀的明星,以其惊人的效率和广泛的适用性著称。它的身影活跃在各种领域,从整理数据到优化搜索,都能看到它的身影。快速排序之所以如此受欢迎,离不开它那巧妙的构思和卓越的性能。

快速排序的核心思想是“分治”。它将一个无序的数组巧妙地拆分为多个更小的子数组,然后分别对这些子数组进行排序,再将排好序的子数组合并起来,从而得到最终的有序数组。

想象一下,您有一叠乱糟糟的扑克牌,需要将其按照数字大小整理出来。您可以采用快速排序的策略,首先挑选一张牌作为“锚点”,然后将剩下的牌分为两堆:一堆是比锚点小的牌,另一堆是比锚点大的牌。接着,您对这两堆牌分别进行相同的操作,直到所有的牌都井然有序地排列好。

为了更好地理解快速排序的过程,我们不妨来看看它的伪代码:

快速排序(数组, 左索引, 右索引) {
  if 左索引 < 右索引 {
    锚点 = 数组[左索引]
    分区索引 = 左索引
    for i = 左索引 + 1 到 右索引 {
      if 数组[i] < 锚点 {
        分区索引++
        交换 数组[分区索引] 和 数组[i]
      }
    }
    交换 数组[左索引] 和 数组[分区索引]
    快速排序(数组, 左索引, 分区索引 - 1)
    快速排序(数组, 分区索引 + 1, 右索引)
  }
}

从伪代码中可以看出,快速排序的递归结构十分清晰。它不断地将数组拆分成更小的子数组,直到每个子数组只有一个元素或者没有元素为止。

快速排序的性能非常出色,在平均情况下,它的时间复杂度为 O(n log n),最坏情况下为 O(n^2)。虽然最坏情况下性能不佳,但快速排序在实际应用中表现非常稳定,因此它在各种场景中都被广泛使用。

为了让您更好地掌握快速排序,我们还准备了 Python 和 JavaScript 的实现代码:

def quick_sort(array, left, right):
  if left < right:
    pivot = array[left]
    partition_index = left
    for i in range(left + 1, right + 1):
      if array[i] < pivot:
        partition_index += 1
        array[partition_index], array[i] = array[i], array[partition_index]
    array[left], array[partition_index] = array[partition_index], array[left]
    quick_sort(array, left, partition_index - 1)
    quick_sort(array, partition_index + 1, right)

# 测试快速排序
array = [10, 7, 8, 9, 1, 5]
quick_sort(array, 0, len(array) - 1)
print(array)
function quickSort(array, left, right) {
  if (left < right) {
    let pivot = array[left];
    let partitionIndex = left;
    for (let i = left + 1; i <= right; i++) {
      if (array[i] < pivot) {
        partitionIndex++;
        [array[partitionIndex], array[i]] = [array[i], array[partitionIndex]];
      }
    }
    [array[left], array[partitionIndex]] = [array[partitionIndex], array[left]];
    quickSort(array, left, partitionIndex - 1);
    quickSort(array, partitionIndex + 1, right);
  }
}

// 测试快速排序
const array = [10, 7, 8, 9, 1, 5];
quickSort(array, 0, array.length - 1);
console.log(array);

通过这些代码,您可以亲手实践快速排序,并加深对它的理解。

除了基本