Java写一个快速排序_快速排序java实现

1.快速排序的思想

快速排序属于交换排序,是冒泡排序的升降版。相对于冒泡排序而言,快速排序增大了记录比较和移动的距离,将关键字较大的记录直接移动到后面,将关键字较小的记录直接移动到前面;不再是相邻两个记录依次进行比较和交换,需要多次移动才能将关键字较大的记录移动到后面。从而快速排序减少了总的比较次数和移动次数。

快速排序是指,在待排序记录中选择一个记录作为基准记录(通常选择第一个),从待排序两端开始交替比较,使得基准记录左侧的记录的关键字都比基准记录的关键字小,右侧都比基准记录大,这就是一趟快排。再将基准记录分出来的两个区域进行快排,以此类推,直到每个分区只有一个元素。

快速排序采用的分冶法的策略。

2.快速排序的本质

快速排序本质是不断确定所选基准值的位置,当分区中只有一个记录时,不需要进行移动,排序结束。网上有一张图展示的很到位:(侵删)

a40dbf23bf44aeec29b41b44fa637ab6.png

3.代码

1 public classQuickSort {2 public int[] quickSort(int[] data, int start, intend){3 if(start > end) return null;4 int pivot = data[start]; //基准值

5 int i =start;6 int j =end;7 inttmp;8 while(i =i && data[j] >= pivot){ //注意这里j>=i

13 j--;14 }15 if(i start){22 tmp =data[start];23 data[start] =data[j];24 data[j] =tmp;25 }26 quickSort(data,start,j-1);27 quickSort(data,j+1,end);28 returndata;29 }30

31 public static voidmain(String[] args){32 QuickSort sort = newQuickSort();33 int[] data = {70,30,40,10,80,20,90,100,75,60,45};34 data = sort.quickSort(data,0,data.length-1);35 for(intx : data) {36 System.out.println("quickSort" +x);37 }38 }39 }

4.需要注意的地方

快排有多种实现方法,在一些资料上提到:每一趟排序必须右端先走,然后左端再走。这样操作的原因是来自于代码的写法,他们的代码写法如下:

1 packagelearn;2 //快速排序

3 public classQuickSort {4 public int[] quickSort(int[] data, int start, intend){5 if(start > end) return null;6 int pivot = data[start]; //基准值

7 int i =start;8 int j =end;9 inttmp;10 while(i =i && data[j] >= pivot){//注意这里j>=i15 //j--;16 //}

17 while(j>i && data[j] >=pivot){18 j--;19 }20 while(i start){ //当j = start避免一趟排序,这个约束条件不是必须的

30 tmp =data[start];31 data[start] =data[j];32 data[j] =tmp;33 }34 quickSort(data,start,j-1);35 quickSort(data,j+1,end);36 returndata;37 }38

39 public static voidmain(String[] args){40 QuickSort sort = newQuickSort();41 int[] data = {70,30,40,10,80,20,90,100,75,60,45};42 data = sort.quickSort(data,0,data.length-1);43 for(intx : data) {44 System.out.println("quickSort" +x);45 }46 }47 }

区别在于第11-16行和第17-22行。按照17-22行,j 结束的条件是 j>i,我们考虑一下while( i < j)结束后 i == j,如果让i 先出发,i 停在值大于基准值的位置;因为 j>i 条件的约束,j只能也停留在i处,这个时候在while( i < j)结束后交换data[j] ,(data[j] == data[i]),就把大于基准值的data[j]交换到基准值左边了。但按照17-22行,让j先出发,总会停在小于基准值的位置,这样循环结束后和基准值交换是没有问题的。

或者按照11-16行的写法,谁先出发无所谓,只要j 结束的条件变成 j >= i,那么 j 会跑到 i 停下来的前一个位置再停下来,这时data[j] 小于基准值,和基准值交换是没有问题的。

以上就是我对这个问题的一点思考了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/501592.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA入门级教学之(方法-调用-5)

/* 方法调用的时候实参和形参要求个数对应相同&#xff0c;数据类型对应相同 -类型不同的时候要求能够进行相应的自动类型转换 */ public class method05 {public static void main(String[] args){//编译错误&#xff0c;参数数量不对//method05.sum();//编译报…

JAVA实现命令助手_samples/简单语音编程,将手机打造成智能助手.md · javalovercn/HomeCenter - Gitee.com...

## 开发 语音小助手让我们用不到50行代码来开发一个跨平台语音生活助手(可运行于iPhone和Android)&#xff0c;它会回答以下类似问题&#xff1a;1. “讲个笑话”&#xff0c;2. “什么是月季”&#xff0c;3. “今天北京到上海的火车”&#xff0c;4. “明天农历”&#xff0c…

JAVA入门级教学之(方法-6)

/* 深入return语句 *带有return关键字的java语句只要执行&#xff0c;所在的方法执行结束。 *在"同一个作用域"中&#xff0c;return语句下面不能编写任何代码&#xff0c;因为 这些代码永远执行不到。所以编译报错 */ public class method06…

java porm.xml_通过Maven仓库安装Spire.PDF for Java

本文将介绍如何通过Maven仓库安装Spire.PDF for Java。首先&#xff0c;在pom.xml文件中配置Maven仓库路径。com.e-icebluee-icebluehttp://repo.e-iceblue.com/nexus/content/groups/public/其次&#xff0c;在pom.xml文件中指定Spire.PDF for Java的Maven依赖e-iceblue spire…

JAVA入门级教学之(方法-7)

/* 在返回值类型是void的方法中使用"return;"语句 "return;"语句出现在返回值为void的方法中主要是为了用来结束当前方法 break;语句主要是跳出整个循环 */ public class method07 {public static void main(String[] args){m();}//编译报错…

java中大数字表示什么_JAVA中大数字的的处理:BigInteger和BigDecimal

关键技术剖析&#xff1a; BigInteger&#xff1a;支持任意精度的整数&#xff0c;可以精确地表示任意大小的整数值&#xff0c;同时在运算过程中不会丢失任何信息。 BigDecimal&#xff1a;可以精确地表示任意精度的小数&#xff0c;同时在运算过程中不会丢失任何信息。源码&a…

JAVA入门级教学之(方法内存分配机制)

目录 JAVA入门级教学之&#xff08;方法内存分配机制&#xff09; 1.方法只定义&#xff0c;不调用&#xff0c;是不会执行的 2.在JVM内存划分上有这样三块主要的内存空间&#xff1a;【还有其它的内存空间】 3.关于"栈"数据结构 4.方法代码片段存在哪里&#xff1f;…

it跟java的区别_详细介绍JAVA和C++区别

JAVA和C都是面向对象语言。也就是说&#xff0c;它们都能够实现面向对象思想(封装&#xff0c;继乘&#xff0c;多态)。而由于c为了照顾大量的C语言使用者&#xff0c;而兼容了C&#xff0c;使得自身仅仅成为了带类的C语言&#xff0c;多多少少影响了其面向对象的彻底性!JAVA则…

JAVA入门级教学之(方法递归)

目录 JAVA入门级教学之&#xff08;方法递归&#xff09; 1.关于方法的递归调用&#xff1a; 2.递归是很耗费栈内存的&#xff0c;递归算法可以不用的时候尽量别用 3.以下程序运行的时候发生了这样的一个错误【不是异常&#xff0c;是错误】 4.递归必须有结束条件&#xff0c;没…

java dom cdata_java – 通过DOM解析器从XML处理CDATA

我以前从未处理过XML,所以我不确定如何在XML文件中处理CDATA.我迷失在节点,父节点,子节点,nList等中.谁能告诉我这些代码片段的问题是什么&#xff1f;我的getTagValue()方法适用于除“详细信息”之外的所有标记,“详细信息”是包含CDATA的标记......NodeList nList doc.getEl…

JAVA入门级教学之(方法递归习题)

/*不使用递归&#xff0c;计算1-N的和使用递归&#xff0c;计算1-N的和 */public class recursion02 {public static void main(String[] args){ //方法1 计算1-4的和//缺点&#xff0c;固定只能计算单独的一次int n4;int sum0;for(int i1;i<4;i){sumi;}System.out.print…

java 异步调用 shell_Java 实现异步调用

class1public class MyExecutor {private ExecutorService executor Executors.newCachedThreadPool() ;public void fun() throws Exception {executor.submit(new Runnable(){overridepublic void run() {try {//要执行的业务代码Thread.sleep(10000);System.out.print(&quo…

JAVA入门级教学之(面向过程和面向对象的区别)

目录 JAVA入门级教学之&#xff08;面向过程和面向对象的区别&#xff09; 面向过程和面向对象的区别&#xff1a; -面向过程&#xff1a; -面向对象&#xff1a; -发展历程&#xff1a; -生命周期中包括&#xff1a; -什么是类&#xff1a; -什么是对象&#xff1a; -软件开发…

cad与连接mySQL数据库_跨服务器操作数据库?其实很简单!(下)

之前一篇文章一步一步的教小伙伴们如何建立SQL Server的数据库链接(DBLINK)&#xff0c;详细步骤可查看上篇&#xff1a;跨服务器操作数据库&#xff1f;其实很简单&#xff01;(上)今天我们来教大家如何连接MYSQL和Oracle的远程数据库创建MYSQL远程链接第一步需要下载MYSQL驱动…

java 中的doit(n)_CoreJava测试题(含答案).docx

CoreJava测试题(含答案)CoreJava测试题班级:____ 姓名:____ 分数:____单选题J2SE作为一种应用和开发环境&#xff0c;提供了一整套实用工具&#xff0c;其中()是Java语言的编译工具。(D)java javadocjavapjavacJava中&#xff0c;以下循环语句的执行次数是(C)。int x37;int y3;…

解决 javac: 找不到文件: 和 HelloJava.java:1: 写入 HelloJava 时出错: HelloJava.class (拒绝访问。) public class Hell

最近在搭建一些服务器导致电脑的一些权限和参数被调整了 然后突然调用最简单的javac变class文件都出现错误 为了相同的错误再次发生&#xff0c;写下警示自己 1."javac: 找不到文件:" 情况一&#xff1a;JAVA文件的后缀名可能被隐藏&#xff0c;打开.java文件的属…

JAVA入门级教学之(定义一个学生类)

首先定义一个学生类 学生类是一个模板&#xff0c;里面描述了学生的共同特征【状态行为】 当前类只描述学生的状态信息【属性】 Student是类&#xff0c;属于引用数据类型&#xff0c;这个类型名就是&#xff1a;Student public class Student {//类体&#xff1a;属…

php如何获取服务器时间_php如何获取当前日期

1、前提条件php网站编程中&#xff0c;我们一般用date函数来获取服务器上的时间。但要想正确调用date函数&#xff0c;必须保证php的配置文件php.ini已经配置正确了&#xff0c;否则调用date函数时会报错&#xff0c;没办法正确进行获取时间。2、用记事本程序打开php配置文件ph…

JAVA入门级教学之(对象的创建和使用)

/* 对象的创建和使用*/ public class OOTest01 {public static void main(String[] args){//通过一个类可是实例化N个对象//实例化对象的语法&#xff1a;new.类名();//new是java语言中的一个运算符//new运算符的作用是创建对象&#xff0c;在JVM【堆】内存中开辟新的内存…

Java构造函数可以私有,我们可以在Java中使用私有的构造函数吗?

甲构造用于创建时初始化对象。从语法上讲&#xff0c;它类似于一种方法。区别在于&#xff0c;构造函数的名称与其类相同&#xff0c;并且没有返回类型。无需显式调用构造函数&#xff0c;这些构造函数会在实例化时自动调用。构造函数允许的访问说明符/修饰符构造函数允许使用p…