【排序算法】快速排序算法 Java实现
快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。
基本思想
- 先从数组中找出一个数作为基准数
- 分区过程,将比这个数小的数全部放到它的左边,大于它的数全部放到右边
- 再对左右区间重复第二步,直到各区间都只有一个数
排序过程
在一篇博客上看到一个很有趣的讲解方法:叫做 挖坑填数+分治法。
假如有一个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]。这时对左右两个区间继续进行排序就好了。
算法实现
/**
* 快速排序
*/
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实现的更多相关文章
- 排序算法-快速排序(Java)
package com.rao.sort; import java.util.Arrays; /** * @author Srao * @className QuickSort * @date 201 ...
- 桶排序与快速排序算法结合-python实现
#-*- coding: UTF-8 -*- import numpy as np from QuickSort import QuickSort def BucketSort(a, n): barr ...
- C#快速排序算法基础入门篇
相信算法对于许多开发人员来说都是一大难点,之所以难,就像设计模式一样,许多人在阅读之后,没有很好地理解,也不愿意动手上机操作,只停留在理论的学习上面,随着时间推移就慢慢淡忘. 有些东西,你可以发明创造 ...
- 数据结构65:快速排序算法(QSort,快排)
上节介绍了如何使用起泡排序的思想对无序表中的记录按照一定的规则进行排序,本节再介绍一种排序算法——快速排序算法(Quick Sort). C语言中自带函数库中就有快速排序——qsort函数 ,包含在 ...
- 排序系列 之 快速排序算法 —— Java实现
基本思想: 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变 ...
- 排序算法系列:快速排序算法JAVA版(靠谱、清晰、真实、可用、不罗嗦版)
在网上搜索算法的博客,发现一个比较悲剧的现象非常普遍: 原理讲不清,混乱 啰嗦 图和文对不上 不可用,甚至代码还出错 为了不误人子弟耽误时间,推荐看一些靠谱的资源,如[啊哈!算法]系列: https: ...
- 基本排序算法——快速排序java实现
简单的快速排序算法,我竟然花费了如此多的时间来写作,好好学习. /** * */ package basic.sort; import java.util.Arrays; import java.ut ...
- java 合并排序算法、冒泡排序算法、选择排序算法、插入排序算法、快速排序算法的描述
算法是在有限步骤内求解某一问题所使用的一组定义明确的规则.通俗点说,就是计算机解题的过程.在这个过程中,无论是形成解题思路还是编写程序,都是在实施某种算法.前者是推理实现的算法,后者是操作实现的算法. ...
- 《Java算法》排序算法-快速排序
排序算法-快速排序: /** * 给定一个数组:按照从小到大排序. * 思路: * 1. 获取第一个数放入临时变量data,将大于data的数放右边,小于data的数放在左边. * 2. data左边 ...
- 快速排序算法 java 实现
快速排序算法 java 实现 快速排序算法Java实现 白话经典算法系列之六 快速排序 快速搞定 各种排序算法的分析及java实现 算法概念 快速排序是C.R.A.Hoare于1962年提出的一种划分 ...
随机推荐
- java的HashCode和equals
什么时候用到hashcode,什么时候用到equals? 首先java为每个对象都生成有默认的hashcode,这个java core里说是java对象的内存地址,但是equals方法里比较的也是对象 ...
- Linux之文件权限属性设置
文件权限属性设置 1.chown命令 chrep命令 chown命令改变某个文件或目录的所有者和所属的组,该命令可以向某个用户授权,使该用户变成指定文件的所有者或者改变文件所属的组. 用户可以是用户或 ...
- ashx文件中使用session提示“未将对象引用设置到对象的实例”
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Data;u ...
- HTTP协议快速入门
一.定义 The Hypertext Transfer Protocol (HTTP) is an application protocol for distributed, collaborativ ...
- Djanto static静态文件配置
django的settings中包含三个static相关设置项: STATIC_ROOT STATIC_URL STATICFILES_DIRS STATIC_URL 好理解,就是映射到静态文件的 ...
- magento中文语言包的使用
magento中文语言包的使用,我们在百度上随便就能找到一大堆. 由于本人今天是第一次使用magento,找到目录magento/app/locale 并且用语言包中的locale文件夹替换掉mag ...
- Java-io流入门到精通详细总结
IO流:★★★★★,用于处理设备上数据. 流:可以理解数据的流动,就是一个数据流.IO流最终要以对象来体现,对象都存在IO包中. 流也进行分类: 1:输入流(读)和输出流(写). 2:因为处理的数据不 ...
- 冒泡排序法-java案例详解
/** * 功能:冒泡排序法 * 思想:通过对待排序序列从后向前(从下标较大的元素开始),依次比较相邻元素的排序码, * ,若发现逆序这交换,使得排序码较小的元素逐渐从后部移向前部(从下标较大的单元移 ...
- animate的{queue:false,duration:400}意思
示例:$(document).ready(function(){ $('.tmplS').hover(function(){ $(".cover", this).stop().an ...
- NodeMCU之旅(二):断线自动重连,闪烁连接状态
事件监听器 NodeMCU采用了事件响应的方式.也就是说,只需为事件设置一个回调函数,当事件发生时,回调函数就会被调用. 注册事件监听器 wif.sta.eventMonReg() 开始监听 wifi ...