通过一趟排序将要排序的数据分割成独立的两部分:分割点左边都是比它小的数,右边都是比它大的数。然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

快速排序原理【转载】:

第一步:设置两个指针left和right分别指向数组的头部和尾部,并且以头部的元素(6)为基准数

第二步:right指针先往左移动,找到小于基准数的元素就停下,然后移动left指针

第三步:left指针往右移动,找到大于基准数的元素就停下,然后交换right和left指针所值元素的值

重复第二、三步,直到两个指针left和right重合

第四步:两个指针重合后将基准数(6)与两个指针指向的元素值(3)交换

   到这时,第一轮排序结束,此时以基准数(6)为分界点,(6)左边的数都小于等于6,(6)右边的数都大于等于6,现在我们已经将原来的序列以(6)为分界点拆成了两个序列左边的序列是3 1 2 5 4,右边的序列是9 7 10 8,接下来分别处理这两个序列,原理相同。

  最终序列为1 2 3 4 5 6 7 8 9 10,到此排序完全结束(快速排序的每一轮处理其实就是将这一轮的基准数归位,直到所有的数都归位为止)

注:为什么是right先移动,不能是left先移动?

  假设需要排列的数组为[ 0 ,  1 ],如果先移动左边指针。此时左指针会移动到1的位置,因此右指针(原本就在1的位置)位置不变。此时将基准书与指针指向的数字进行交换,结果就变成了[ 1 ,  0 ],而实际情况我们需要的是左边比基准数小,右边比基准数大,所以产生的结果就完全相反了。

  下面附上实现代码:

package algorithmimplementation;
public class QuickSort {
public static void main(String[] args) {
int[] num = new int[]{6,1,2,7,9,3,4,5,10,8};
for(int a:quickSort(num, 0, num.length-1)) {
System.out.print(a+" ");
}
}
public static int[] quickSort(int[] num, int leftPos, int rightPos) {
if(rightPos < leftPos)
return num;
else {
//将数列最左边第一个数字作为基准数
int initLeftPos = leftPos;
int initRightPos = rightPos;
int baseNum = num[leftPos]; while(rightPos > leftPos) {
//第二步:右边指针找到小于基准数的就停下
while(num[rightPos] >= baseNum & rightPos > leftPos) {
rightPos--;
} //第二步:左边指针找到大于基准数的就停下
while(num[leftPos] <= baseNum & rightPos > leftPos) {
leftPos++;
} //交换两个指针最终标记的数字
if(rightPos > leftPos)
swap(num,leftPos,rightPos);
} //当左右两边指针重合时,将基准数与指针指向数字交换
swap(num,leftPos,initLeftPos); //指针左半边递归,以进来的数组的左边为界,右边是左右指针相同时左边一个
quickSort(num, initLeftPos, leftPos-1); //右边同理
quickSort(num, rightPos+1, initRightPos); return num;
}
} //swap方法:将数组中leftPos和rightPos上的两个数值进行交换
public static void swap(int[] num,int leftPos,int rightPos) {
int temp = num[leftPos];
num[leftPos] = num[rightPos];
num[rightPos] = temp;
}
}

JAVA快速排序代码实现的更多相关文章

  1. java快速排序代码

    public class test1 { public static int partition(int[] array,int lo,int hi){ int key=array[lo]; whil ...

  2. pagebean pagetag java 后台代码实现分页 demo 前台标签分页 后台java分页

    java 后台代码实现分页 demo 实力 自己写的 标签分页 package com.cszoc.sockstore.util; import java.util.HashMap;import ja ...

  3. 经典KMP算法C++与Java实现代码

    前言: KMP算法是一种字符串匹配算法,由Knuth,Morris和Pratt同时发现(简称KMP算法).KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的.比 ...

  4. 常用 Java 静态代码分析工具的分析与比较

    常用 Java 静态代码分析工具的分析与比较 简介: 本文首先介绍了静态代码分析的基 本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBu ...

  5. 分享:根据webservice WSDL地址自动生成java调用代码及JAR包

    分享:根据webservice WSDL地址自动生成java调用代码及JAR包使用步骤:一.安装java 并配置JAVA_HOME 及 path二.安装ANT 并配置ANT_HOME三.解压WsdlT ...

  6. FastDFS搭建及java整合代码【转】

    FastDFS软件介绍 1.什么是FastDFS FastDFS是用C语言编写的一款开源的分布式文件系统.FastDFS为互联网量身定制,充分考虑了冗余备份.负载均衡.线性扩容等机制,并注重高可用.高 ...

  7. [原创]Java静态代码检查工具介绍

    [原创]Java静态代码检查工具介绍 一  什么是静态代码检查? 静态代码分析是指无需运行被测代码,仅通过分析或检查源程序的语法.结构.过程.接口等来检查程序的正确性,找出代码隐藏的错误和缺陷,如参数 ...

  8. 最近开始研究PMD(一款采用BSD协议发布的Java程序代码检查工具)

    PMD是一款采用BSD协议发布的Java程序代码检查工具.该工具可以做到检查Java代码中是否含有未使用的变量.是否含有空的抓取块.是否含有不必要的对象等.该软件功能强大,扫描效率高,是Java程序员 ...

  9. java集合框架之java HashMap代码解析

     java集合框架之java HashMap代码解析 文章Java集合框架综述后,具体集合类的代码,首先以既熟悉又陌生的HashMap开始. 源自http://www.codeceo.com/arti ...

随机推荐

  1. html之样式

    HTML 样式 1. font字体 font-family 字体样式 比如:微软雅黑.Serif 字体.Sans-serif 字体.Monospace 字体.Cursive 字体.Fantasy 字体 ...

  2. SpringCloud服务的注册发现--------Eureka

    1,什么叫做服务的注册与发现 服务的注册与发现基于注册中心,注册中心本身是一个服务,也相当于一个载体,其他服务的注册需要注册到这个注册中心上. 注册:当服务器启动的时候,会将自己的服务器信息,通过别名 ...

  3. 深入理解Java AIO(三)—— Linux中的AIO实现

    我们调用的Java AIO底层也是要调用OS的AIO实现,而OS主要也就Windows和Linux这两大类,当然还有Solaris和mac这些小众的. 在 Windows 操作系统中,提供了一个叫做 ...

  4. LeetCode(42.接雨水)多解法详解

    接雨水解法详解: 题目: 基本思路:从图上可以看出要想接住雨水,必须是凹字形的,也就是当前位置的左右两边必须存在高度大于它的地方,所以我们要想知道当前位置最多能存储多少水,只需找到左边最高处max_l ...

  5. D - D 分糖果HDU - 1059(完全背包+二进制优化)

    有两个小朋友想要平分一大堆糖果,但他们不知道如何平分需要你的帮助,由于没有spj我们只需回答能否平分即可. 糖果大小有6种分别是1.2.3.4.5.6,每种若干颗,现在需要知道能不能将这些糖果分成等额 ...

  6. Pointer Lock API(1/3):Pointer Lock 的总体认识

    前言 指针锁定(Pointer Lock),以前也叫鼠标锁定,提供了基于鼠标随时间的移动(如deltaΔ)的输入方法,不仅仅是视窗区域鼠标的绝对位置.指针锁定让你能够访问原始的鼠标移动,将鼠标事件的目 ...

  7. js中常见的数据加密与解密的方法

    加密在我们前端的开发中也是经常遇见的.本文只把我们常用的加密方法进行总结.不去纠结加密的具体实现方式(密码学,太庞大了). 常见的加密方式 常见的加密算法基本分为这几类, 线性散列算法(签名算法)MD ...

  8. Hadoop(九):Shuffle组件

    重温MR整体流程 工作流程 开始执行输入(InputFormat),先对文件进行分片,然后读取数据输入到Map中. Mapper读取输入内容,解析成键值对,1行内容解析成1个键值对,每个键值对调用一次 ...

  9. ensp的基础路由命令,接口,下一跳的配置,入门必备

    关于ensp入门事情,第一件事当是安装必备三件套:而后,应该是接触路由和PC机了,最烦人满屏代码,眼花缭乱: 今天写一篇零基础接触ensp的首次操作,PC-路由-路由-PC的互通实验: 实验要拉出两台 ...

  10. 我对KMP算法的理解

    KMP算法的核心在于失配回溯表——pnext,相比于通过逐个比较来匹配字符串的朴素算法,KMP通过对模式串的分析,可以做到比较指针在主串上不回溯,一直向前. 1. KMP如何实现不回溯? 对于主串 t ...