快速排序-数据结构与算法

简介: 快速排序(Quick Sort)是一种基于分治法的高效排序算法。其核心思想是通过选择基准(pivot),将数组划分为左右两部分,使得左侧元素均小于基准,右侧元素均大于基准,然后递归地对左右两部分进行排序。时间复杂度平均为 O(n log n),最坏情况下为 O(n²)(如数组已有序)。空间复杂度为 O(1),属于原地排序,但稳定性不佳。实现步骤包括编写 `partition` 核心逻辑、递归调用的 `quickSort` 和辅助函数 `swap`。优化方法有随机化基准和三数取中法,以减少最坏情况的发生。

🔥 1. 快速排序(Quick Sort)

核心思想

本算法用到了分区的思想,分而治之,即分治法。

分治法:将原问题分解为若干个子问题,直到子问题可以求解为止,子问题的解的合并即原问题的解。

产生的子问题往往和原问题相同,只是原问题的较小规模的表达。递归。

  1. 选一个基准(pivot)(通常选最后一个元素)。
  2. 分区(Partition):把比 pivot 小的放左边,大的放右边。
  3. 递归排序:对左右两部分分别排序。
public void quicksort(int[]arr,left,right){
        if (left>right)
            return //当left大于right的时候就可以返回了
        int  privotIndex=partition(arr,left,right);//分区的位置
        quicksort(arr,privotIndex+1,right);//排序右半部分
        quicksort(arr,left),privotIndex-1);//排序左半部分  开始递归
}

quicksort不断递归自己,对privot左右两边的数据进行比较分区排序,比基准小的放左边,比基准大的放在右边。


public void partition(int[]arr, left,right){
        int pivot=arr[right];//选择基准,以最后一个元素为基准
        int i=left;//i是小于pivot的边界值
        for(int j=left;j<right;j++)//遍历完传进来的数组,数组最左边的开始
        {
            if(arr[j]<=pivot){   当当前元素小于等于pivot 交换到左边
                swap(arr,i,j);
                i++//移动边界
            }
        }
    swap(arr,i.right);将pivot 放在正确的位置
    return i;返回pivot 的索引
}
public swap(int[]arr ,i,j){
    int temp=arr[i];
    arr[i]=arr[j];
    arr[j]=temp;
}

如何手撕?

  1. 先写 partition(核心逻辑)。
  2. 再写 quickSort(递归调用)。
  3. 最后写 swap(辅助函数)。

关于基准的选择,与时间复杂度的关系:

时间复杂度 平均 O(n log n),最坏 O(n²)(如数组已有序)
空间复杂度 O(1)(原地排序)
稳定性 不稳定(可能交换相同元素)
适用场景 通用排序(如 Arrays.sort() 底层用它

如何优化快速排序?

随机化基准(避免最坏情况)。

三数取中法(选第一个、中间、最后一个的中位数作为基准)

相关文章
|
6月前
|
搜索推荐 C语言
【排序算法】快速排序升级版--三路快排详解 + 实现(c语言)
本文介绍了快速排序的升级版——三路快排。传统快速排序在处理大量相同元素时效率较低,而三路快排通过将数组分为三部分(小于、等于、大于基准值)来优化这一问题。文章详细讲解了三路快排的实现步骤,并提供了完整的代码示例。
151 4
|
6月前
|
存储 搜索推荐 Python
用 Python 实现快速排序算法。
快速排序的平均时间复杂度为$O(nlogn)$,空间复杂度为$O(logn)$。它在大多数情况下表现良好,但在某些特殊情况下可能会退化为最坏情况,时间复杂度为$O(n^2)$。你可以根据实际需求对代码进行调整和修改,或者尝试使用其他优化策略来提高快速排序的性能
183 61
|
4月前
|
搜索推荐 C++
【C++数据结构——内排序】快速排序(头歌实践教学平台习题)【合集】
快速排序是一种高效的排序算法,基于分治策略。它的主要思想是通过选择一个基准元素(pivot),将数组划分成两部分。一部分的元素都小于等于基准元素,另一部分的元素都大于等于基准元素。然后对这两部分分别进行排序,最终使整个数组有序。(第一行是元素个数,第二行是待排序的原始关键字数据。本关任务:实现快速排序算法。开始你的任务吧,祝你成功!
102 7
|
7月前
|
算法 搜索推荐 Shell
数据结构与算法学习十二:希尔排序、快速排序(递归、好理解)、归并排序(递归、难理解)
这篇文章介绍了希尔排序、快速排序和归并排序三种排序算法的基本概念、实现思路、代码实现及其测试结果。
157 1
|
7月前
|
搜索推荐
冒泡排序(Bubble Sort)以及选择排序(Selection Sort)和快速排序(Quick Sort)详细解析
冒泡排序(Bubble Sort)以及选择排序(Selection Sort)和快速排序(Quick Sort)详细解析
99 1
|
7月前
【初阶数据结构】打破递归束缚:掌握非递归版快速排序与归并排序
【初阶数据结构】打破递归束缚:掌握非递归版快速排序与归并排序
|
7月前
|
搜索推荐 Java Go
深入了解快速排序算法
深入了解快速排序算法
137 2
|
7月前
|
算法
蓝桥杯宝藏排序 | 数据结构 | 快速排序 归并排序
蓝桥杯宝藏排序 | 数据结构 | 快速排序 归并排序
|
9月前
|
搜索推荐 算法 Java
现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法
该博客文章通过UML类图和Java源码示例,展示了如何使用适配器模式将QuickSort类和BinarySearch类的排序和查找功能适配到DataOperation接口中,实现算法的解耦和复用。
133 1
现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法
|
7月前
|
存储 搜索推荐 算法
【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析
【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析