java快排原理_Java数据结构与算法——快速排序

声明:码字不易,转载请注明出处,欢迎文章下方讨论交流。

前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督。本篇文章介绍排序算法中最常用也是面试中最容易考到的排序算法——快排,包括快排的思想和原理、java快排代码、快排的特点性能和快排的适用场景。

0、其他排序算法索引(待更)

1、快速排序思想及原理

事实上,快速排序是堆冒泡排序的一种改进。

它的基本思想是:通过一趟排序将要排序的数据分割为两部分,第一部分所有数据比第二部分的所有数据小,按照这种思路将两部分数据再次分别进行快速排序,可以使用递归完成,最终使得整个数据序列有序。

具体来讲,在待排数据中找一个基准数据(通常取第一个数),接下来将待排数据中比基准数据小的放在待排数据的左侧,将比待排数据中比基准数据大的放在待排数据右侧。此时,左右两个分区的元素相对有序,接着采用上述思路继续对左右两个分区继续排序,直到各分区只有一个元素位置。这里用到了一个典型的分治思想。下面举例说明:

待排序列依次为47、29、71、99、78、19、24、47。为了区分两个47,将后面的47下面增加一个下划线。

步骤:

1、选取一个基准数,一般选第0个元素47。

2、将比基准数小的移动到左侧,比基准数大的移动到右侧,相等的不移动,此时基准数位置为K。

3、对左右两侧重复步骤1和步骤2,直到左右侧细分到只有一个元素。

快排的难点也就是在第2步,怎么移动各个数据?

<1> 首先从数列的右边开始往左找,设下标为i,也就是i--操作,找到第一个比基准数小的值,让他与基准数交换;

<2> 接着开始从左往右找,设下标为j,也就是j++,找到第一个比基准数大的值,让他与基准数交换位置;

<3> 重复1和2,直到i和j相遇时结束,最后基准值所在位置为k。

2、java快排代码

public class QuickSort {

private int[] array;

public QuickSort(int[] array){

this.array = array;

}

public void printSort(){

for (int i = 0; i < array.length; i++) {

System.out.println(array[i]);

}

}

public void sort(){

quicksort(array,0,array.length -1);

}

private void quicksort(int[] array,int begin,int end){

if(begin

int base = array[begin]; //取第一个值为基准值

int i = begin; //左标记为i

int j = end; //右标记为j

//一趟排序,找到比基准值大的在基准值右,比基准值小的在基准值左

while(i

//从右往左扫描

while(ibase){ //从右往左扫,如果元素比基准值大

j--; //则右边标记--,直到找到第一个比基准值小的,停止扫描

}

if(i

array[i]=array[j]; //交换右扫描第一个比基准值小的数

i++; //i标记右移一位

}

//从左往右扫描

while(i

i++; //则左标记++,直到找到第一个比基准值大的,停止扫描

}

if(i

array[j]=array[i]; //交换左扫描第一个比基准值大的数

j--; //j标记左移一位

}

} //此时基准值左右两侧相对有序

array[i] = base; //此时i为中间位置k

quicksort(array,begin,i-1); //左侧按照快排思路,递归

quicksort(array,i+1,end); //右侧按照快排思路,递归

}

}

}

测试代码

public class SortTest {

public static void main(String[] args) {

teseQuickSort();

}

private static void teseQuickSort(){

int[] array = {3,5,7,3,8,9,6,1,0};

QuickSort qs = new QuickSort(array);

qs.sort();

qs.printSort();

}

}

3、快排的特点及性能

快排是在冒泡排序之上改进而来的,冒泡排序每次只能交换相邻的两个元素,而快排则是跳跃式的交换,交换距离很大,总的比较次数和交换次数少了很多,速度也快了很多。

快排的平均时间复杂度为O(nlogn),事实上,大多数情况下,排序速度要快于这个时间复杂度。快排实际上是采用的一种分而治之的思想,把问题分解为一个个的小问题去逐一解决,最终在把结果组合起来。

快排因为递归调用,所以空间复杂度为O(logn)。

快排是一种不稳定的排序算法,在经过排序后,等值的元素的相对位置可能发生改变。

快排基本上被认为是相同数量级中所有排序算法中平均性能最好的。

4、快排的适用场景

快排由于相对简单而且性能不错,所以快排适用于几乎绝大多数场合。

码字不易,如对您有帮助,欢迎点赞收藏打赏^_^

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

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

相关文章

厚积薄发,拥抱 .NET 2016

厚积薄发这个词是高三英语老师在高考前写在黑板上&#xff0c;高中三年努力这么久&#xff0c;是时候迎面而上&#xff0c;冲刺向前。所以&#xff0c;一想到.NET 2016&#xff0c;脑海里蹦出的第一个词就是它。 .NET 2016 是 .NET 一次质的飞跃&#xff0c;不管难易&#xff0…

CGLIB 实现代理对象API

转载自 CGLIB 实现代理对象API1. 加入库cglib库cglib-2.2.jarasm库(cglib 需要asm库,如果没有加入asm的jar文件,就会报asm错误)asm-3.1.jar 2. 定义CGLIB操作类package com.machome.cglibtest;import java.lang.reflect.Method;import com.machome.model.StuService;import net…

android java split_Java中的split函数的用法

Java中的 split 函数是用于按指定字符(串)或正则去分割某个字符串&#xff0c;结果以字符串数组形式返回&#xff1b;例如:String str"1234abc";String[] a str.split("");System.out.println("处理结果: "a[0]","a[1]); //输出的…

第二章指南(4.2)添加 Controller

原文&#xff1a;Adding a controller翻译&#xff1a;娄宇(Lyrics)校对&#xff1a;刘怡(AlexLEWIS)、何镇汐、夏申斌、孟帅洋(书缘) Model-View-Controller (MVC) 架构模式将一个应用程序分离成三个主要的组件&#xff1a; Model、View 以及Controller 。 MVC 模式帮助你创建…

jdk和cglib简单理解

转载自 jdk和cglib简单理解之前使用cglib的时候不需要将classLoader作为参数传入&#xff0c;但动态代理却要&#xff0c;带着这个疑惑进入这个方法&#xff1a;Proxy.newProxyInstance(classLoader, interfaces, InvocationHandler)要在classLoader里去找interfaces&#xff0…

mysql引擎总结_MySQL存储引擎对比总结

存储引擎是数据库的核心&#xff0c;对于mysql来说&#xff0c;存储引擎是以插件的形式运行的。虽然mysql支持种类繁多的存储引擎&#xff0c;但是常用的就那么几种。这篇文章主要是对其进行一个总结和对比。一、引言在mysql5之后&#xff0c;支持的存储引擎有十几个&#xff0…

DotNet Core 介绍

前言 asp.net core rtm 6月底即将发布&#xff0c;自己也想着为社区做点共享&#xff0c;刚好最近不太忙&#xff0c;看到社区的小伙伴们都在为dotnet core的推广而贡献力量&#xff0c;项目中刚好在用rc2版本&#xff0c;就多写些文章来帮助那些还在学习的朋友们吧。 目录 dot…

jdbc java_Java中使用JDBC

JDBC简介JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API&#xff0c;可以为多种关系数据库提供统一访问&#xff0c;它由一组用Java语言编写的类和接口组成。本文中中使用的数据库数据库软件&#xff1a;MySQL5.6数据库&#xff1a;test表&…

动态代理proxy与CGLib的区别

转载自 动态代理proxy与CGLib的区别昨天被人问及动态代理与CGlib的区别&#xff0c;赶紧回顾一下&#xff1a; 什么是代理&#xff1f;静态代理与动态代理静态代理实例JDK动态代理实例CGLib 简介CGLib 与JDK动态代理的区别代理模式是Java中常见的一种模式&#xff0c;英文名字叫…

【干货】”首个“ .NET Core 验证码组件

前言 众所周知&#xff0c;Dotnet Core目前没有图形API&#xff0c;以前的System.Drawing程序集并没有包含在Dotnet Core 1.0环境中。不过在dotnet core labs项目里可以见到MS已经在移植这个项目&#xff0c;不过目前的版本只能在Windows上和NET541或DNX环境中才可以使用。 不过…

java 招聘要求_Java程序员如何进阶,一般招聘都有哪些要求?

作为当前市场上应用领域最广、人才需求最大的编程语言&#xff0c;Java一直是人们入行IT行业的选择。然而&#xff0c;随着大批量的人涌入Java开发行业&#xff0c;企业的招聘门槛也在无形中抬高&#xff0c;提升专业技能成为新手Java程序员实现升职加薪的有效途径。分析各大招…

朝花夕拾——Java的synthetic修饰词

转载自 朝花夕拾——Java的synthetic修饰词Ok&#xff0c;目前为止&#xff0c;我还只是Android coder&#xff0c;一切对其他的学习都是以Android 为主线的支线任务。所以为什么会提到这个方法呢&#xff1f;是来自于google官方的性能建议文档的这样一句话&#xff1a;Consid…

asp.net MVC 应用程序的生命周期

首先我们知道http是一种无状态的请求&#xff0c;他的生命周期就是发出请求开始&#xff0c;到得到响应结束。那么MVC应用程序从发出请求到获得响应&#xff0c;都做了些什么呢&#xff1f; 本文我们会详细讨论MVC应用程序的生命周期和一个请求&#xff0c;从一个控件到另一个控…

java 刷新界面_利用java如何实现在删除信息后刷新页面功能

利用java如何实现在删除信息后刷新页面功能发布时间&#xff1a;2020-11-17 14:25:49来源&#xff1a;亿速云阅读&#xff1a;74作者&#xff1a;Leah这篇文章给大家介绍利用java如何实现在删除信息后刷新页面功能&#xff0c;内容非常详细&#xff0c;感兴趣的小伙伴们可以参考…

Java中的synthetic

转载自 Java中的synthetic 有synthetic标记的field和method是class内部使用的&#xff0c;正常的源代码里不会出现synthetic field。小颖编译工具用的就是jad.所有反编译工具都不能保证完全正确地反编译class。所以你不能要求太多。 下面我给大家介绍一下synthetic 下面的例子…

java凯撒密码_JAVA凯撒密码 选择问题

以下是加密和解密的程序&#xff1a;加密&#xff1a;importjava.io.*;classJiami26{publicstaticvoidmain(Stringargs[])throwsIOException{charb[];//存放密文BufferedReaderbr2newBufferedReader(newIn...以下是加密和解密的程序&#xff1a;加密&#xff1a;import java.io…

synthetic Java合成类型

转载自 synthetic Java合成类型Synthetic看Class源码的时候&#xff0c;看到有个关键字Synthetic以及isSynthetic()方法&#xff0c;遂有兴趣查阅了一番。   一开始以为&#xff0c;就是复合类型&#xff08;引用类型&#xff09;&#xff0c;也就是非基本类型&#xff0c;…

Java 反射机制深入研究

转载自 Java 反射机制深入研究Java反射机制深入研究Java 反射是Java语言的一个很重要的特征&#xff0c;它使得Java具体了“动态性”。在Java运行时环境中&#xff0c;对于任意一个类&#xff0c;能否知道这个类有哪些属性和方法&#xff1f;对于任意一个对象&#xff0c;能否…

RAML用户应遵循的C#与Web API代码生成模式

在过去几年间&#xff0c;REST规范的各种语言正在逐渐流行起来&#xff0c;例如RAML、Swagger以及API Blueprint。但这些语言的主要范畴在于客户端工具&#xff0c;主要用于生成JavaScript或TypeScript文件、模拟对象&#xff08;mock&#xff09;&#xff0c;以及对应的客户端…

wxpython使用folium_wxPython实现文本框基础组件

本文实例为大家分享了wxPython实现文本框的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下#-*- coding:utf-8 -*-"""#############################################StaticText 参数说明 --即 labelparent&#xff1a; -- 父窗口部件。id&#xff1a;…