【数据结构与算法】:交换排序之快速排序(手绘图解+LeetCode原题)

一、快速排序

1.什么是快速排序?

快速排序是交换排序的一种,本质上快速排序就是采用“分而治之”的策略(分治法),将问题规模减小,再而对问题分别进行处理的排序算法。

2.快速排序的基本原理。

快速排序的原理:在已有元素中,任选一个元素作为“基准”,根据“基准”,将未排序元素划分为两个子序列,一个子序列的元素均小于基准元素,而另一个子序列的元素均大于基准元素,然后递归地对这两个子序列进行排序。

快速排序示意图(44为基准):
在这里插入图片描述

3.实现快速排序的具体过程。

①选取一个元素作为基准,与末尾元素交换位置。
②设置两个指针(Low和High),分别指向首元素与倒数第二个元素。
在这里插入图片描述
③Low指针由左向右扫描,其位置左侧放置的都是遍历过的或交换过的小于基准的元素;
—High指针从右向左扫描,其位置右侧放置的都是遍历过的或交换过的大于基准的元素。
—首先是Low指针向后扫描,遇到大于基准的元素停止;
—然后是High指针向前扫描,遇到小于基准的元素停止。
④在指针还未错位时(在 Low < High 时),将 High 和 Low 指向的元素交换位置。
在这里插入图片描述
⑤重复上述操作,直至 High指针 和 Low指针 错位
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
⑥错位后停止,将基准元素与指针Low指向元素交换位置,至此,我们成功将小于基准的元素放在其左,大于基准的元素放于其右!
——这代表我们成功完成了一次划分,以基准为边界分别划分成小于和大于基准的两个子序列。
在这里插入图片描述
⑦递归地对两个子序列,用同样的方法进行快速排序即可。

二、算法优化

需注意:
—在特殊情况下,比如在序列基本有序的情况下,若每次划分得到的两个子序列都是1比(N-1)的情况时,快速排序执行时间复杂度接近于冒泡排序的O(N²)。
—为了避免最坏结果,我们需要在下标为Low,High,(Low+High)/ 2的三个元素中取得中间值元素作为序列的基准,这样有可能避免最坏情况。

三、快速排序代码实现(优化后)。

import java.util.Arrays;

/**
 * @author .29.
 * @create 2022-09-09 21:37
 */
public class QuickSort {
   
   
    public static void main(String[] args) {
   
   
        int[] arr = {
   
   85,12,59,36,62,44,43,94,7,35,52};//案例
        String str1 = Arrays.toString(arr);
        Qsort(arr,0,arr.length - 1);        //进行快速排序
        String str2 = Arrays.toString(arr);            //转换为字符串方便输出展示

        System.out.println(str1);                      //原序列输出
        System.out.println(str2);                      //快速排序后
    }

    public static void Qsort(int[] arr,int left,int right){
   
   
        if(left < right){
   
   
     
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.29.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值