快速排序是对冒泡排序的一种改进。它的基本思想是:通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要 小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。最坏情况的时间复杂度为O(n^2),最好 情况时间复杂度为O(nlogn)。

假设要排序的数组是A[1]……A[N],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一躺快速排序。一趟快速排序的算法是:

1)、设置两个变量I、J,排序开始的时候I:=1,J:=N;

2)以第一个数组元素作为关键数据,赋值给X,即X:=A[1];

3)、从J开始向前搜索,即由后开始向前搜索(J:=J-1),找到第一个小于X的值,两者交换;

4)、从I开始向后搜索,即由前开始向后搜索(I:=I+1),找到第一个大于X的值,两者交换;

5)、重复第3、4步,直到I=J;

例如:待排序的数组A的值分别是:(初始关键数据X:=49)

A[1]    A[2]    A[3]    A[4]   A[5]   A[6]    A[7]:

49       38      65      97      76      13       27

进行第一次交换后: 27       38      65      97      76      13       49

( 按照算法的第三步从后面开始找)

进行第二次交换后: 27       38      49      97      76      13       65

    ( 按照算法的第四步从前面开始找>X的值,65>49,两者交换,此时I:=3 )

进行第三次交换后: 27       38      13      97      76      49       65

   ( 按照算法的第五步将又一次执行算法的第三步从后开始找)

进行第四次交换后: 27       38      13      49      76      97       65

  ( 按照算法的第四步从前面开始找大于X的值,97>49,两者交换,此时J:=4 )

此时再执行第三步的时候就发现I=J,从而结束一躺快速排序,那么经过一躺快速排序之后的结果是:

27      38       13     
49     76       97       65

即所有大于49的数全部在49的后面,所有小于49的数全部在49的前面。

快速排序就是递归调用此过程——在以49为中点分割这个数据序列,分别对前面一部分和后面一部分进行类似的快速排序,从而完成全部数据序列的快速排序,最后把此数据序列变成一个有序的序列。

=========================下面是快排的Java代码==========================

测试用例:arr=null  arr={1,2,3,4,5,6}  arr={6,5,4,3,2,1}  arr={49,38,65,97,76,13,27}

 package com.szy.sort;

 public class QuickSort {

     public static void main(String[] args)
{
int[] arr = {49,38,65,97,76,13,27};
// int[] arr = {6,5,4,3,2,1};
// int[] arr = {1,2,3,4,5,6};
quicklySort(arr,0,arr.length-1); for(int k=0; k<arr.length;k++){
System.out.print(arr[k]+" ");
}
} private static void quicklySort(int[] arr, int begin, int end) {
if(arr==null || arr.length==0){
return;
}
if(begin<end){
int index = partition(arr,begin,end);
quicklySort(arr,begin, index-1);
quicklySort(arr, index+1, end);
}
} /** 分区方法:将元素划分为两部分,左部分小于分区元素,右部分大于分区元素,最后返回中间的分区元素的索引值 */
private static int partition(int[] arr, int begin, int end) {
int key = arr[begin]; //分区元素key,选取第一个元素作为分区元素
int keyI = begin; //记录key的索引值 while(begin<end){
while(begin<end && arr[end]>key){ //从右往左扫描,直到找到小于key值的,然后交换它们
end--;
}
if(begin<end){
swap(arr,keyI,end); //交换key值和右边第一个小于key值的索引处的值
keyI = end; //记录此时和key交换的那个索引值
}
while(begin<end && arr[begin]<key){ //从左往有扫描,知道找到大于key值的,然后交换它们
begin++;
}
if(begin<end){
swap(arr,keyI,begin); //交换key值和左边第一个大于key值的索引处的值
keyI = begin; //记录此时和key交换的那个索引值
}
} return keyI; //返回分区元素的索引值
} /** 用于交换数组中的两个元素 */
private static void swap(int[] arr, int i, int j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
} }

Java中快速排序的实现的更多相关文章

  1. java中快速排序的理解以及实例

    所谓的快速排序的思想就是,首先把数组的第一个数拿出来做为一个key,在前后分别设置一个i,j做为标识,然后拿这个key对这个数组从后面往前遍历,及j--,直到找到第一个小于这个key的那个数,然后交换 ...

  2. 冒泡,选择,插入,快速排序在Java中的实现

    近几天再重新看数据结构的书时,根据各种排序的空间复杂度,发现快速排序所用时间是最短的,也即是说快速排序的速度最快.因此想验证一下具体这几个排序发的快慢,所以在Java中得以实现,同时在运行时,发现虽然 ...

  3. Java中的经典算法之快速排序(Quick Sort)

    Java中的经典算法之快速排序(Quick Sort) 快速排序的思想 基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小, 然后再按此方法对 ...

  4. Java中的排序算法(2)

    Java中的排序算法(2) * 快速排序 * 快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists). * 步骤为: * 1. 从数 ...

  5. Java中的数组排序

    Java中的数组排序,一般是利用Arrays.sort(),这个方法是经过优化的快速排序.在Arrays种有多中形式的重载,在这里就不一一列举了. 数组排序的种类: 1.非降序排序, 非升序排序(就排 ...

  6. Java 泛型快速排序 以sdut 1196为例

    oj链接:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1196 Java中,Arrays.so ...

  7. JAVA中运用数组的四种排序方法

    JAVA中在运用数组进行排序功能时,一般有四种方法:快速排序法.冒泡法.选择排序法.插入排序法. 快速排序法主要是运用了Arrays中的一个方法Arrays.sort()实现. 冒泡法是运用遍历数组进 ...

  8. 【JAVA零基础入门系列】Day10 Java中的数组

    什么是数组?顾名思义,就是数据的组合,把一些相同类型的数放到一组里去. 那为什么要用数组呢?比如需要统计全班同学的成绩的时候,如果给班上50个同学的成绩信息都命名一个变量进行存储,显然不方便,而且在做 ...

  9. Java中常见的排序方法

    本博主要介绍Java中几种常见的排序算法: /* 排序方法的演示1)插入排序(直接插入排序.希尔排序)2)交换排序(冒泡排序.快速排序)3)选择排序(直接选择排序.堆排序)4)归并排序5)分配排序(基 ...

随机推荐

  1. Computer Vision and Machine Learning Competitions

    一.ImageNet Object Detection, Object Classification+Localization 二.COCO Image Captioning 三.LFW Face R ...

  2. Mysql事务及行级锁的理解

    在最近的开发中,碰到一个需求签到,每个用户每天只能签到一次,那么怎么去判断某个用户当天是否签到呢?因为当属表设计的时候,每个用户签到一次,即向表中插入一条记录,根据记录的数量和时间来判断用户当天是否签 ...

  3. 【移动开发】Android中WIFI开发总结(二)

    搞了好几天终于有点眉目了,这里接着总结一下Android中WiFi的使用,在前面(http://smallwoniu.blog.51cto.com/3911954/1334951)我们已经简单了解了W ...

  4. Android组件系列----BroadcastReceiver广播接收器

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...

  5. 2_Linux_文件和权限处理命令

    三.Linux的常用命令 1.文件命名规范 1)除了/之外,所有的字符都合法,文件名中不能包含/符号 2)有些字符最好不用,如空格.制表符.退格符和字符@#$&() 3)避免使用.作为普通文件 ...

  6. adb服务无法启动

    今天学习android编程发现调试出错 The connection to adb is down, and a severe error has occured. You must restart ...

  7. Wpf解决TextBox文件拖入问题、拖放问题

    在WPF中,当我们尝试向TextBox中拖放文件,从而获取其路径时,往往无法成功(拖放文字可以成功).造成这种原因关键是WPF的TextBox对拖放事件处理机制的不同, 解放方法如下: 使用Previ ...

  8. C# Gma.QrCodeNet生成二维码

    一.使用C#生成二维码类库之一是qrcodenet 源代码地址: http://qrcodenet.codeplex.com/ 二.使用实例 定义处理字符串 static string url = & ...

  9. AFNetworking3.0出现Error Domain=com.alamofire.error.serialization.response Code=-1016 "Request failed: unacceptable

    在发送请求后一直报错, 浏览器解析却没有问题, 所以基本可以确定是AFNetworking的问题 下面是解决方法: AFHTTPSessionManager *manager = [AFHTTPSes ...

  10. mysql死锁--源于外键关联

    死锁 存在于行级锁 存在的条件 1.资源只能同时被一个线程占有 2.资源占有不能被强制剥夺 3.请求和保持占有(在请求占有资源的同时能保持现有资源的占有) 4.死循环(一般做程序的人最关注的点) 一到 ...