快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。

  1. 基本思想

    1. 先从数组中找出一个数作为基准数
    2. 分区过程,将比这个数小的数全部放到它的左边,大于它的数全部放到右边
    3. 再对左右区间重复第二步,直到各区间都只有一个数
  2. 排序过程

    一篇博客上看到一个很有趣的讲解方法:叫做 挖坑填数+分治法

    假如有一个10个数的数组:i=0,j=9,pivot=array[i]=x

    由于已经array[0]中的数保存到pivot中,可以理解成在数组array[0]上挖了个坑,可以将其他数据填充到这里来。

    然后j向前找比当前基准数pivot小的数,当符合条件时(比如是第8个参数),那么将array[8]挖出填充到array[0]这个坑。这时就多出了array[8]这个坑,于是从i开始向后找大于pivot的数,填充array[8]这个坑。

    重复操作。

    最后i==j时会退出循环,这时多出了array[i]这个坑,怎么办呢?将pivot填充到array[i]。这时对左右两个区间继续进行排序就好了。

  3. 算法实现

    /**
* 快速排序
*/
public class QuickSort {
public void sort(int[] array) {
quickSort(array, 0, array.length - 1);
} /**
* 通过划分,基于分治思想,递归执行子任务排序最后合并
* @param low 数组首位索引
* @param high 数组末尾索引
*/
private void quickSort(int[] array, int low, int high) {
int pivotPos;
if (low < high) {
pivotPos = partition(array, low, high);
quickSort(array, low, pivotPos - 1);
quickSort(array, pivotPos + 1, high);
}
} /**
* 简单划分方法
*/
private int partition(int[] array, int i, int j) {
int pivot = array[i]; // array[i] 就是 第一个坑 while (i < j) {
while (i < j && array[j] >= pivot) {
j--; // 从右向左找出小于基准数pivot的数来填充array[i]
} if (i < j) {
array[i] = array[j]; // 将array[j]填充到array[i]中,array[j]就形成了一个新的坑
i++;
} while (i < j && array[i] <= pivot) {
i++; // 从左向右找出大于基准数pivot的数来填充array[j]
} if (i < j) {
array[j] = array[i]; // 将array[i]填充到array[j]中,array[i]就形成了一个新的坑
j--;
}
} array[i] = pivot; // 退出时,i等于j。将pivot填到这个坑中。
return i;
}
}

参考文章:

1. http://blog.csdn.net/morewindows/article/details/6684558

2. http://shiyanjun.cn/archives/800.html

【排序算法】快速排序算法 Java实现的更多相关文章

  1. 排序算法-快速排序(Java)

    package com.rao.sort; import java.util.Arrays; /** * @author Srao * @className QuickSort * @date 201 ...

  2. 桶排序与快速排序算法结合-python实现

    #-*- coding: UTF-8 -*- import numpy as np from QuickSort import QuickSort def BucketSort(a, n): barr ...

  3. C#快速排序算法基础入门篇

    相信算法对于许多开发人员来说都是一大难点,之所以难,就像设计模式一样,许多人在阅读之后,没有很好地理解,也不愿意动手上机操作,只停留在理论的学习上面,随着时间推移就慢慢淡忘. 有些东西,你可以发明创造 ...

  4. 数据结构65:快速排序算法(QSort,快排)

    上节介绍了如何使用起泡排序的思想对无序表中的记录按照一定的规则进行排序,本节再介绍一种排序算法——快速排序算法(Quick Sort). C语言中自带函数库中就有快速排序——qsort函数 ,包含在 ...

  5. 排序系列 之 快速排序算法 —— Java实现

    基本思想: 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变 ...

  6. 排序算法系列:快速排序算法JAVA版(靠谱、清晰、真实、可用、不罗嗦版)

    在网上搜索算法的博客,发现一个比较悲剧的现象非常普遍: 原理讲不清,混乱 啰嗦 图和文对不上 不可用,甚至代码还出错 为了不误人子弟耽误时间,推荐看一些靠谱的资源,如[啊哈!算法]系列: https: ...

  7. 基本排序算法——快速排序java实现

    简单的快速排序算法,我竟然花费了如此多的时间来写作,好好学习. /** * */ package basic.sort; import java.util.Arrays; import java.ut ...

  8. java 合并排序算法、冒泡排序算法、选择排序算法、插入排序算法、快速排序算法的描述

    算法是在有限步骤内求解某一问题所使用的一组定义明确的规则.通俗点说,就是计算机解题的过程.在这个过程中,无论是形成解题思路还是编写程序,都是在实施某种算法.前者是推理实现的算法,后者是操作实现的算法. ...

  9. 《Java算法》排序算法-快速排序

    排序算法-快速排序: /** * 给定一个数组:按照从小到大排序. * 思路: * 1. 获取第一个数放入临时变量data,将大于data的数放右边,小于data的数放在左边. * 2. data左边 ...

  10. 快速排序算法 java 实现

    快速排序算法 java 实现 快速排序算法Java实现 白话经典算法系列之六 快速排序 快速搞定 各种排序算法的分析及java实现 算法概念 快速排序是C.R.A.Hoare于1962年提出的一种划分 ...

随机推荐

  1. android 菜单的总结

    安卓菜单有三种菜单. 选项菜单: 点击系统菜单按钮会触发 上下文菜单:长按屏幕触发 子菜单:某一个菜单的下一级菜单 具体的描叙:http://blog.csdn.net/zqiang_55/artic ...

  2. Spring Boot Web Executable Demo

    Spring Boot Web Executable Demo */--> pre.src {background-color: #292b2e; color: #b2b2b2;} pre.sr ...

  3. UVa 270 & POJ 1118 - Lining Up

    题目大意:给一些点,找出一条直线使尽可能多的点在这条直线上,求这条直线上点的个数. 以每一个点为原点进行枚举,求其它点的斜率,斜率相同则说明在一条直线上.对斜率排序,找出斜率连续相等的最大长度. #i ...

  4. Html 定位position

    CSS position属性和实例应用   目前几乎所有主流的浏览器都支持position属性("inherit"除外,"inherit"不支持所有包括IE8和 ...

  5. JavaScript中typeof和instanceof深入详解

    这次主要说说javascript的类型判断函数typeof和判断构造函数原型instanceof的用法和注意的地方. typeof 先来说说typeof吧.首先需要注意的是,typeof方法返回一个字 ...

  6. 2.2. 添加托管对象模型(Core Data 应用程序实践指南)

    右键分组Grocery Dude > New Group > Data Model New File > Core Data > 创建新的模板文件

  7. CSS 文本、字体、链接

    CSS 文本属性可定义文本的外观. 通过文本属性,您可以改变文本的颜色.字符间距,对齐文本,装饰文本,对文本进行缩进,等等. 缩进文本 把 Web 页面上的段落的第一行缩进,这是一种最常用的文本格式化 ...

  8. HDU-1275-两车追及或相遇问题(数学题目)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1275 这题是一个数学题目,知道两个公式那就好办了: 对头相遇时:time*(v1+v2)=d*(2*i ...

  9. MongoDB安装环境搭建

    Mongodb的默认端口号27017 _id是全局唯一值,不要去给这个列赋值,默认是唯一的,如果赋值,列入有两列的_id:2,则会报冲突不能插入 [root@HE4 ~]# tar xvf mongo ...

  10. Flex 各种校验

    Flex 各种校验: 参考:http://blog.csdn.net/jerry_bj/article/details/5650469 参考正则表达式:http://www.cnblogs.com/f ...