Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 156|回复: 0

[默认分类] java实现的快速排序算法

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2018-5-28 13:41:54 | 显示全部楼层 |阅读模式
      
    快速排序的原理:选择一个关键值作为基准值。比基准值小的都在左边序列(一般是无序的),比基准值大的都在右边(一般是无序的)。一般选择序列的第一个元素。
    一次循环:从后往前比较,用基准值和最后一个值比较,如果比基准值小的交换位置,如果没有继续比较下一个,直到找到第一个比基准值小的值才交换。找到这个值之后,又从前往后开始比较,如果有比基准值大的,交换位置,如果没有继续比较下一个,直到找到第一个比基准值大的值才交换。直到从前往后的比较索引>从后往前比较的索引,结束第一次循环,此时,对于基准值来说,左右两边就是有序的了。
    接着分别比较左右两边的序列,重复上述的循环。

    1. public class FastSort{
    2.      public static void main(String []args){
    3.         System.out.println("Hello World");
    4.         int[] a = {12,20,5,16,15,1,30,45,23,9};
    5.         int start = 0;
    6.         int end = a.length-1;
    7.         sort(a,start,end);
    8.         for(int i = 0; i<a.length; i++){
    9.              System.out.println(a[i]);
    10.          }
    11.         
    12.      }
    13.      
    14.      public void sort(int[] a,int low,int high){
    15.          int start = low;
    16.          int end = high;
    17.          int key = a[low];
    18.          
    19.          
    20.          while(end>start){
    21.              //从后往前比较
    22.              while(end>start&&a[end]>=key)  //如果没有比关键值小的,比较下一个,直到有比关键值小的交换位置,然后又从前往后比较
    23.                  end--;
    24.              if(a[end]<=key){
    25.                  int temp = a[end];
    26.                  a[end] = a[start];
    27.                  a[start] = temp;
    28.              }
    29.              //从前往后比较
    30.              while(end>start&&a[start]<=key)//如果没有比关键值大的,比较下一个,直到有比关键值大的交换位置
    31.                 start++;
    32.              if(a[start]>=key){
    33.                  int temp = a[start];
    34.                  a[start] = a[end];
    35.                  a[end] = temp;
    36.              }
    37.          //此时第一次循环比较结束,关键值的位置已经确定了。左边的值都比关键值小,右边的值都比关键值大,但是两边的顺序还有可能是不一样的,进行下面的递归调用
    38.          }
    39.          //递归
    40.          if(start>low) sort(a,low,start-1);//左边序列。第一个索引位置到关键值索引-1
    41.          if(end<high) sort(a,end+1,high);//右边序列。从关键值索引+1到最后一个
    42.      }
    43.      
    44. }
    45.         
    复制代码


      

    上面最后一句不是基准值的意思是,不是直接用基准值交换,是用基准值所在的索引交换。
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-6-1 11:59 , Processed in 0.341314 second(s), 35 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表