0
点赞
收藏
分享

微信扫一扫

快速排序(分治思想)

什么是快速排序

        快速排序(Quick Sort)是一种广泛使用的高效排序算法,由计算机科学家托尼·霍尔在1960年提出。它采用分治法(Divide and Conquer)策略,将一个大数组分为两个小数组,然后递归地对这两个小数组进行排序。快速排序在平均情况下具有良好的性能,时间复为 O(nlog⁡n)O(nlogn),并且在实际应用中通常比其他 O(nlog⁡n)O(nlogn) 的排序算法(如归并排序和堆排序)更快。

核心思想

快速排序的核心思想可以概括为以下几个步骤:

两个指针的定义和移动

在快速排序的实现中,我们使用两个指针 i 和 j 来进行分区操作。

  • i 指针从左到右扫描数组,找到第一个大于基准的元素。
  • j 指针从右到左扫描数组,找到第一个小于等于基准的元素。
  • 当 i 小于 j 时,交换 i 和 j 指向的元素。

这个过程一直持续到 i 大于等于 j,此时分区操作完成。

根据基准值交换

        在分区过程中,当 i 小于 j 时,我们需要交换 i 和 j 指向的元素。这样可以确保左侧的元素都小于等于基准,右侧的元素都大于基准。

        让我们来看两道题目带你快速上手

示例一

题目描述

代码

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int arr[] = new int[n];

        for (int i = 0; i < n; i++) {
            arr[i] = scanner.nextInt();
        }
        quickSort(arr, 0, n-1);
        for (int i = 0; i < n; i++) {
            System.out.print(arr[i] + " ");
        }
    }
    public static void quickSort(int[] arr,int l,int r) {
        if (l >= r) return;
        int x = arr[l+r >> 1];
        int i = l - 1, j = r + 1;
        while (i < j) {
            do ++i;while (arr[i] < x) ;
            do --j;while (arr[j] > x);
            if (i < j) {
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
        quickSort(arr, l, j);
        quickSort(arr, j + 1, r);
    }
}

解释

示例二

题目描述

代码

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n,k;
        n = sc.nextInt();
        k = sc.nextInt();
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = sc.nextInt();
        }
        quickSort(arr, 0, n - 1);
        System.out.println(arr[k - 1]);
    }
    public static void quickSort(int[] arr,int l,int r) {
        if (l >= r) return;
        int x = arr[l];
        int i = l - 1, j = r + 1;
        while (i < j) {
            do ++i; while (arr[i] < x) ;
            do --j; while (arr[j] > x);
            if (i < j) {
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
        quickSort(arr, l, j);
        quickSort(arr, j + 1, r);
    }
}

解释

总结

        快速排序是一种高效的排序算法,它采用分治法的思想,通过递归的方式将数组分为两个子数组,然后对这两个子数组进行排序。通过选择基准、分区和递归调用,快速排序能够在平均情况下以 O(nlog⁡n)O(nlogn) 的时间复杂度完成排序。尽管在最坏情况下可能退化为 O(n2)O(n2),但通过合理的基准选择和随机化策略,可以有效避免这一问题。快速排序的空间效率和实际性能使其成为排序任务中的热门选择。

举报

相关推荐

0 条评论