【算法系列】快速排序详解

快速排序的多种实现方式

快速排序(Quick Sort)是一种高效的排序算法,采用分治法策略。它通过选择一个“基准”元素,将数组分割成两个子数组,并递归地对这两个子数组进行排序。本文将详细介绍几种常见的快速排序实现方式,并讨论它们的特点和适用场景。
在这里插入图片描述

1. 基本快速排序(Lomuto 分区方案)

1.1 基本原理

Lomuto 分区方案是最常见的快速排序实现之一。它选择数组的最后一个元素作为基准(pivot),然后重新排列数组,使得所有小于基准的元素位于基准的左侧,所有大于基准的元素位于基准的右侧。

1.2 步骤

  1. 选择基准:通常选择数组的最后一个元素作为基准。
  2. 初始化指针:设置一个指针 i,用于追踪当前小于基准的最后一个元素的位置。
  3. 遍历数组
    • 遍历数组中的每个元素(除了基准元素),如果当前元素小于等于基准,则将该元素与 i 指针所指向的元素交换,并将 i 向右移动一位。
  4. 放置基准:最后将基准元素与 i + 1 位置的元素交换,使得基准元素处于正确的位置。
  5. 递归排序:对基准两侧的子数组分别递归执行上述过程,直到每个子数组只剩下一个元素或为空。

1.3 Java 实现示例

public static void quickSort(int[] arr) {
   
   
    quickSort(arr, 0, arr.length - 1);
}

private static void quickSort(int[] arr, int low, int high) {
   
   
    if(low >= high) {
   
   
        return;
    }
    int pivotIndex = lomuto(arr, low, high);
    quickSort(arr, low, pivotIndex - 1);
    quickSort(arr, pivotIndex + 1, high);
}

private static int lomuto(int[] arr, int low, int high) {
   
   
    int pivot = arr[high]; // 选择最后一个元素作为基准
    int i = low - 1; // 指向当前小于基准的最后一个元素

    for (int j = low; j < high; j ++) {
   
   
        if(arr[j] <= pivot) {
   
   
            i ++;
            if(i != j) {
   
   
                swap(arr, i, j);
                System.out.println(low + "|" + high + " " + i + "|" + j + " " + Arrays.toString(arr));
            }
        }
    }

    // 将基准元素放回数组正确位置
    swap(arr, i + 1, high);
    System.out.println(low + "|" + high + "\t \t" + Arrays.toString(arr));
    return i + 1;
}

/**
 * 交换数组索引为i和j的两个元素
 * @param arr
 * @param i
 * @param j
 */
private static void swap(int[]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值