快速排序详解(Java实现)

2023-05-16

一、快速排序的基本思想

    每一轮的排序都会将区域分割成两个独立的分区,其中左分区的序列的所有值均会比右分区的所有值小。然后对子分区进行同样的分割操作,最后达到整体有序。在排序的过程中,由于已经分开的两部分的元素不需要进行比较,故减少了比较的次数,降低了排序时间。

 

二、快速排序的详细描述

    首先在要排序的区域a 中选取一个基准值,而后将区域分成两个分区,其中左分区 b 中的元素均小于或者等于基准值,右分区 c 的元素 均大于或者等于中轴值,而后通过递归调用快速排序的过程分别对两个分区再次进行排序,最后将两个分区产生的结果合并即可得到最后的排序序列。

  “基准值”的选择有很多种方法。最简单的是使用分区中第一个元素值。但是如果输入的数组是正序或者逆序的,就会将所有的记录分到“基准值”的一边。较好的方法是随机选取“基准值”,这样可以减少原始输入对排序造成的影响。但是随机选取“基准值”的开销大。

 

三、快速排序的算法思想

   为了实现一次划分,我们可以从数组(假定数据是存在数组中)的两端移动下标,必要时交换记录,直到数组两端的下标相遇为止。为此,我们附设两个指针(下标)i 和 j, 先通过 j 从当前区域的右端向左扫描,越过大于等于基准值的记录。当遇到小于基准值的记录时,扫描停止。然后,通过 i 从当前区域的左端向右扫描,越过小于基准值的记录。当遇到大于等于基准值的记录时,扫描停止。交换两个方向扫描停止的记录 a[j] 与 a[i]。 然后,继续扫描,直至 i 与 j 相遇为止,本轮扫描和交换的过程结束。这时i左边的记录的关键字值都小于基准值,右边的记录的关键字值都大于等于基准值。

最后,当前下标i=j,交换规则使得下标i左边的元素值一定会小于等于基准值,i右边元素值一定会大于等于基准值。所以最后一步是将当前i下标元素值与基准值交换。完成一轮快排,递归,同样对子分区进行操作,直至快排结束。

 通过两个不相邻元素交换,可以一次交换消除多个逆序,加快排序速度。快速排序方法在要排序的数据已经有序的情况下最不利于发挥其长处。

 

四、快速排序的核心算法

quickSort(int left,int right){
    int i = left;
    int j = right;
    int temp=a[left];
    int t;
    while(i!=j){	//①当i与j没有相遇的时候,执行移动查找
        while(j>i && a[j]>=temp){
            j--;    	//②略过大于等于基准值的下标
        }		//③当找到小于基准值,j下标停止移动
        while(i<j && a[i]<=temp){
            i++;		//②略过小于等于基准值的下标
        }   		 //③当找到大于基准值,i下标停止移动
        if(i<j){		//④交换下标i和j的元素值
            t = a[i];
            a[i]=a[j];
            a[j]=t;
        }
    }	//⑤当i与j相遇的时候,停止移动查找
    //⑥交换基准值和当前相遇下标的元素值
    a[left]=a[i]; 
    a[i]=temp; 

    //⑦完成一轮分区,已经将区域划分去左右两个分区,执行递归,对分区继续操作
    quickSort(left,i-1);
    quickSort(j+1,right);
}

五、快速排序源码实现

package sort;



public class QuickSort {

    private static int[] a = {6,1,2,7,9,3,4,5,10,8};

    public static void main(String[] args){
        System.out.println("原数组值:");
        for (int i : a) {
            System.out.print(i+" ");
        }
        System.out.println();
        quickSort(0, a.length-1);
    }

    public static void quickSort(int left,int right){
        int i,j,temp;
        if(left>right){
            return;
        }
        temp=a[left]; //temp中存的就是基准数
        i=left;
        j=right;
        while(i!=j){
            //顺序很重要,要先从右边开始找 ,直到找到一个小于基准的值
            while(a[j]>=temp && i<j){
                j--;
            }
            //再找右边的 ,直到找到一个大于基准的值
            while(a[i]<=temp && i<j){
                i++;
            }
            //交换两个数在数组中的位置
            if(i<j) {
                int t=a[i];
                a[i]=a[j];
                a[j]=t;      
                System.out.println("交换值后:");
                for (int k : a) {
                    System.out.print(k+" ");
                }
                System.out.println();
            }
       }
        //最终将基准数归位
        a[left]=a[i];
        a[i]=temp;
        System.out.println("基准值归位后:");
        for (int k : a) {
            System.out.print(k+" ");
        }
        System.out.println();
        if(left<i-1){
            quickSort(left,i-1);//继续处理左边的,这里是一个递归的过程
        }
        if(right>j+1){
            quickSort(i+1,right);//继续处理右边的 ,这里是一个递归的过程
        }
    }
}

 

六、结果值查看

原数组值:
6 1 2 7 9 3 4 5 10 8 
交换值后:
6 1 2 5 9 3 4 7 10 8 
交换值后:
6 1 2 5 4 3 9 7 10 8 
基准值归位后:
3 1 2 5 4 6 9 7 10 8 
基准值归位后:
2 1 3 5 4 6 9 7 10 8 
基准值归位后:
1 2 3 5 4 6 9 7 10 8 
基准值归位后:
1 2 3 4 5 6 9 7 10 8 
交换值后:
1 2 3 4 5 6 9 7 8 10 
基准值归位后:
1 2 3 4 5 6 8 7 9 10 
基准值归位后:
1 2 3 4 5 6 7 8 9 10 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

快速排序详解(Java实现) 的相关文章

随机推荐

  • C++符号修饰Name-mangling

    C 43 43 符号修饰 C语言符号修饰 在上古时期 xff0c 编译器编译源代码产生目标文件时 xff0c 符号名与相应的变量和函数的名字是一样的 比如一个汇编源代码里面包含一个函数foo xff0c 那么汇编器将其编译成目标文件后 xf
  • VS Code远程SSH免密登录配置

    最近更新了VS Code之后 xff0c 发现Remote ssh拓展里的端口转发功能没了 xff0c 很伤心 xff0c 在探索的同时 xff0c 顺手配置了一下VS Code ssh免密登录 xff0c 以省去每次连接远程文件夹时输入两
  • 目标检测之一(传统算法和深度学习的源码学习)

    目标检测之一 xff08 传统算法和深度学习的源码学习 xff09 本系列写一写关于目标检测的东西 xff0c 包括传统算法和深度学习的方法都会涉及到 xff0c 注重实验而不着重理论 xff0c 理论相关的看论文去哈 xff0c 主要依赖
  • FreeRTOS中任务切换过程的分析

    FreeRTOS中Pendsv任务切换过程的分析 一 Pendsv中断任务解析 xff08 1 xff09 uxCriticalNesting 是进入临界区的次数 xff08 2 xff09 pxCurrentTCB是FreeRTOS运行时
  • CentOS6关闭防火墙使用以下命令

    cmd命令关闭防火墙 net stop mpssvc CentOS6关闭防火墙使用以下命令 xff0c 临时关闭 service iptables stop 禁止开机启动 chkconfig iptables off CentOS7中若使用
  • 《软件工程》试题举例-简答题

    Please give out 3 pieces of recommendations regarding language independent good programming practice 6 marks 良好的编程实践的建议
  • 2020届电子信息类专业保研经历分享

    文章目录 一 个人基本情况二 初心三 夏令营 九推情况介绍1 上海交大自动化系直硕面试 xff08 7月8日 xff09 2 中科大信息学院夏令营 xff08 7月15日 xff09 3 中科院自动化所夏令营 xff08 7月23日 xff
  • RGB图与灰度图相互转换关系表达式

    RGB图转灰度图 1 Y 61 0 3R 43 0 59G 43 0 11B 2 平均值法 xff0c 将RGB平均 灰度图转RGB图 先将单通道的灰度图转为三通道的RGB图 xff0c 各通道值的初值赋值为与灰度值相同 然后按照下式映射关
  • sklearn包导入错误:ImportError: cannot import name ‘Type‘解决办法

    在python3 5环境下使用pip直接安装sklearn包后 xff0c 导入出现如下错误 xff1a 仔细观察报错信息可以发现 xff0c 出错的是sklearn中使用到的scipy包 单独导入scipy包发现出错 xff1a 看来 x
  • PyTorch Dataloader报错ValueError: num_samples的另一种可能原因

    先粘报错信息 xff1a Traceback most recent call last File train py line 169 in train test File train py line 29 in train test da
  • Focal loss变种汇总

    VariFocal loss 只对负样本做难易样本挖掘 xff08 正样本数量少 xff0c 不做loss压缩 xff09 Generalized Focal loss xff1a quality focal loss 43 distrib
  • 视觉Transformer中的位置编码方式

    绝对位置编码 基本形式 xff1a x 61 x 43 p 可学习的绝对位置编码 xff08 ViT xff09 ViT中提出的位置编码方式简单粗暴 xff0c 设置一组可学习的编码tokens xff0c 并在patch embeding
  • 秋招问题汇总

    1 Python变量作用域 xff1a 局部作用域 xff08 Local xff0c 简写为 L xff09 作用于闭包函数外的函数中的作用域 xff08 Enclosing xff0c 简写为 E xff09 全局作用域 xff08 G
  • 38、OpenCV之C++教程

    一 OpenCV的下载与安装 下载完成后会得到一个 opencv 3 4 15 vc14 vc15 exe 文件 点击运行后会生成一个文件夹 此文件夹为下一步工程创建使用 xff0c 文件夹可移动 复制和重命名 xff0c 这里命名如下 x
  • Java大数据之路--HDFS详解(3)--基本命令

    HDFS 分布式文件存储系统 基本命令 目录 HDFS 分布式文件存储系统 基本命令 一 常见命令 二 其他命令 一 常见命令 命令 说明 hadoop fs mkdir park 在hdfs 的根目录下 xff0c 创建 park目录 h
  • C# 连接 SqlServer 数据库

    目录 一 创建表 二 给表添加数据 三 新建 C 项目 四 SqlServerHelper 五 连接数据库 一 创建表 首先 xff0c 新建一个数据库 Test xff0c 然后新建一个表 Users xff0c 字段名如下图 xff0c
  • org.xml.sax.SAXParseException的错误解决 2020-11-20

    span class token number 2020 span span class token operator span span class token number 11 span span class token operat
  • JS如何优雅的删除对象中的指定属性?

    要优雅的话 xff0c 使用 Lodash 的 omit 方法移除不要的属性 xff1a const object 61 a 1 b 2 c 3 const result 61 omit object a c 61 gt b 2 或者用 p
  • python 使用 isdigit 判断字符串中是否只由数字组成

    span class token operator span span class token operator span span class token operator span span class token operator s
  • 快速排序详解(Java实现)

    一 快速排序的基本思想 每一轮的排序都会将区域分割成两个独立的分区 xff0c 其中左分区的序列的所有值均会比右分区的所有值小 然后对子分区进行同样的分割操作 xff0c 最后达到整体有序 在排序的过程中 xff0c 由于已经分开的两部分的