快速排序也是一种分治的排序算法。快速排序和归并排序是互补的:归并排序将数组分成两个子数组分别排序,并将有序的子数组归并以将整个数组排序,会需要一个额外的数组;而快速排序的排序方式是当两个子数组都有序时,整个数组就自然有序了,快速排序可以不产生额外的数组。

对于小数组(N<=20),快速排序不如插入排序。所以,小数组建议使用其他排序。

  快速排序可以由以下几步组成:

  1.如果数组S中的元素个数是0或1,则返回。

  2.取S中任一元素v,称为枢纽元。

  3.将S中其余元素(除枢纽元)分为两部分,一部分是小于v的,放在v的左边,一部分是大于v的,放在v的右边。

  4.再将左右两部分继续递归快速排序。

细节:

  1.选取枢纽元

    一种通常的、无知的选择就是选取第一个元素用作枢纽元。如果输入是随机的,那么这也是可以接受的,而如果输入是预排序的或者反序的,这样的分割就毫无意义,因为所有元素都是比第一个元素大或都比它小,这样就只会划分成一部分。此时花费的时间是二次的,而实际上却没有干什么事。

    一般的做法是使用左端、右端和中心位置上的三个元素的中值(中间大小的那个数)作为枢纽元。

  2.分割策略

    在分割阶段要做的就是把小于枢纽元的元素移到数组左边,把大于枢纽元的元素移到数组右边。

     先假设所有元素互异。方法是:将枢纽元与最后一个元素交换位置,使枢纽元离开要被分割的数据段。i 从第一个元素开始,j 从倒数第二个元素开始。当 i 在 j 左边时,将 i 右移,移过那些小于枢纽元的元素(这些元素就该放在数组左边),并将 j 左移,移过那些大于枢纽元的元素。当 i 和 j 停止时,说明此事 i 指向了一个比枢纽元大的元素,j 指向了一个比枢纽元小的元素。如果 i 比 j 小,则交换这两个元素,也就是把i指向的大元素(相对于枢纽元)放到数组右边,j 指向的小元素放到数组左边,然后 i 和 j 继续移动。如果 i 大于 j ,说明已经移动结束,此时i左边都是比枢纽元小的, i 的右边(包括i)都是比枢纽元大的。最后将 i 元素与枢纽元互换。

    如果 i 和 j 遇到了与枢纽元相同的元素,那么也应该停下来。

  代码:

本博客参考《数据结构与算法分析java语言描述》

排序算法入门之快速排序(java实现)的更多相关文章

  1. 常用的排序算法介绍和在JAVA的实现(二)

    一.写随笔的原因:本文接上次的常用的排序算法介绍和在JAVA的实现(一) 二.具体的内容: 3.交换排序 交换排序:通过交换元素之间的位置来实现排序. 交换排序又可细分为:冒泡排序,快速排序 (1)冒 ...

  2. 各种排序算法的分析及java实现

    排序一直以来都是让我很头疼的事,以前上<数据结构>打酱油去了,整个学期下来才勉强能写出个冒泡排序.由于下半年要准备工作了,也知道排序算法的重要性(据说是面试必问的知识点),所以又花了点时间 ...

  3. (转)各种排序算法的分析及java实现

    转自:http://www.cnblogs.com/liuling/p/2013-7-24-01.html 排序一直以来都是让我很头疼的事,以前上<数据结构>打酱油去了,整个学期下来才勉强 ...

  4. 排序算法之直接插入排序Java实现

    排序算法之直接插入排序 舞蹈演示排序: 冒泡排序: http://t.cn/hrf58M 希尔排序:http://t.cn/hrosvb  选择排序:http://t.cn/hros6e  插入排序: ...

  5. 各种排序算法的分析及java实现 分类: B10_计算机基础 2015-02-03 20:09 186人阅读 评论(0) 收藏

    转载自:http://www.cnblogs.com/liuling/p/2013-7-24-01.html 另可参考:http://gengning938.blog.163.com/blog/sta ...

  6. 排序算法四:快速排序(Quicksort)

    快速排序(Quicksort),因其排序之快而得名,虽然Ta的平均时间复杂度也是O(nlgn),但是从后续仿真结果看,TA要比归并排序和堆排序都要快. 快速排序也用到了分治思想. (一)算法实现 pr ...

  7. js实现两种实用的排序算法——冒泡、快速排序

      分类:js (4443) (0) 零:数据准备,给定数组arr=[2,5,4,1,7,3,8,6,9,0]; 一:冒牌排序 1思想:冒泡排序思想:每一次对比相邻两个数据的大小,小的排在前面,如果前 ...

  8. js实现两种排序算法——冒泡、快速排序

    * 一:冒牌排序1思想:冒泡排序思想:每一次对比相邻两个数据的大小,小的排在前面,如果前面的数据比后面的大就交换这两个数的位置要实现上述规则需要用到两层for循环,外层从第一个数到倒数第二个数,内层从 ...

  9. 排序算法合集(Java)

    整理了一下常用的排序算法,算法过程和示意图不详细讲,百度很多,只列代码,如有错误,还望大家指出. 1.冒泡排序 public static void bubbleSort(int[] a){ for( ...

随机推荐

  1. Java基础---Java---IO流-----对象的序列化、管道流、RandomAccessFile、数据类型的流对象DataStream、ByteArrayStream

    ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化. ObjectOutputStream 和 ObjectInputStream ...

  2. JS 可变参数

     JS可变参数的方法不需要参数,同时,我们应该注意在写JS文件的时候避免定义arguments变量. <html> <head> <title>Javascri ...

  3. 头部——MimeHeaders

    http协议的请求头部更像一个键值对,例如Content-Length : 123,前面为键后面为值,表示文本长度为123.对于若干个头部在请求对象中被封装成MimeHeaders对象,MimeHea ...

  4. GrabCut in One Cut(基于图割算法grabcut的一次快速图像分割的OpenCV实现)----目前效果最好的图割

     One cut in grabcut(grabcut算法的非迭代实现?) 本文针对交互式图像分割中的图割算法,主要想翻译一篇英文文献.不足之处请大家指正. 这是博主近期看到的效果最好,实现最简单 ...

  5. JAVA之旅(二十)—HashSet,自定义存储对象,TreeSet,二叉树,实现Comparator方式排序,TreeSet小练习

    JAVA之旅(二十)-HashSet,自定义存储对象,TreeSet,二叉树,实现Comparator方式排序,TreeSet小练习 我们继续说一下集合框架 Set:元素是无序(存入和取出的顺序不一定 ...

  6. Java的字符串分割的不同实现

    在java中实现字符串的分割相对而言是很简单的.我们一般会采取两中方式.一个是从jdk1.1就开始的StringTokenizer类,另一个是调用split方法进行分割.下面请看代码: import ...

  7. DQM Serial Sync Index Program ERROR

    Error syncing hz_stage_party_sites_t1:ORA-20000:Oracle Text 错误: DRG-10502:索引AR.HZ_STAGE_PARTY_SITES_ ...

  8. Android官方技术文档翻译——清单合并

    本文译自Android官方技术文档<Manifest Merger>,原文地址:http://tools.android.com/tech-docs/new-build-system/us ...

  9. Unable To Import Or Enter Sale Order - ORA-20001: APP-FND-01564: ORACLE error - 1422 in get_seq_info

    In this Document   Symptoms   Cause   Solution APPLIES TO: Oracle Order Management - Version 12.0.4 ...

  10. 浅谈C之精华---指针

    今天是2016年的第一天,祝大家元旦快乐!哎,今天有点倒霉,代码写到一半,突然机子就没电了,幸好有保存,否则今天没有这篇日志的出现. 好了,今天以我个人的角度来深度剖析一下C语言中关于指针的用法以及注 ...