快速排序是一种高效的排序算法,采用分治法的策略,平均时间复杂度为 (O(n \log n))。它的基本思想是选择一个基准元素(pivot),然后将待排序的数组分为两部分:左边部分的所有元素小于基准元素,右边部分的所有元素大于等于基准元素。接着,对这两部分分别递归地进行快速排序,最终合并起来得到一个有序数组。

快速排序的步骤

  1. 选择基准:从数组中选择一个基准元素,通常选择第一个元素、最后一个元素或随机选择一个元素。
  2. 分区:通过一趟排序将数组分为两部分,左侧小于基准,右侧大于等于基准,并返回基准的位置。
  3. 递归排序:对左侧和右侧的子数组分别递归调用快速排序。

Java实现

下面是一个简单的Java代码实现快速排序的示例:

public class QuickSort {

    public static void quickSort(int[] arr, int low, int high) {
        if (low < high) {
            // 获取分区点
            int partitionIndex = partition(arr, low, high);

            // 递归排序左半边
            quickSort(arr, low, partitionIndex - 1);
            // 递归排序右半边
            quickSort(arr, partitionIndex + 1, high);
        }
    }

    private static int partition(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++;
                // 交换arr[i]和arr[j]
                swap(arr, i, j);
            }
        }
        // 将基准元素放到正确的位置,将大于基准的元素移到右边
        swap(arr, i + 1, high);
        return i + 1; // 返回基准的索引
    }

    private static void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    public static void main(String[] args) {
        int[] arr = {10, 7, 8, 9, 1, 5};
        int n = arr.length;

        System.out.println("原始数组:");
        printArray(arr);

        quickSort(arr, 0, n - 1);

        System.out.println("排序后的数组:");
        printArray(arr);
    }

    private static void printArray(int[] arr) {
        for (int num : arr) {
            System.out.print(num + " ");
        }
        System.out.println();
    }
}

代码解析

  1. quickSort 方法首先检查当前数组部分如果有元素(即 low < high),则继续进行排序。
  2. 调用 partition 方法进行分区,并返回基准元素的位置。
  3. 然后对基准元素左右的子数组递归调用 quickSort 进行排序。
  4. partition 方法实现了分区逻辑:遍历数组,将比基准小的元素移到左边,将基准元素放到正确的位置。
  5. swap 方法用于交换数组中的两个元素。

总结

快速排序是一种非常有效的排序算法,尽管在最坏情况下(例如数组已经是有序的情况下)时间复杂度为 (O(n^2)),但在大多数情况下,平均时间复杂度为 (O(n \log n))。此外,快速排序通常是原地排序,这意味着它只需要常数级的额外空间,因而在实际应用中使用广泛。理解并掌握快速排序的原理和实现,对于学习数据结构和算法是非常重要的一步。

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部