随手编程---快速排序(QuickSort)-Java实现
背景
快速排序,是在上世纪60年代,由美国人东尼·霍尔提出的一种排序方法。这种排序方式,在当时已经是非常快的一种排序了。因此在命名上,才将之称为“快速排序”。这个算法是二十世纪的七大算法之一,平均情况下时间复杂度为Ο(nlogn),而且在O(nlogn)的情况下,实际的运算速度都要快于其他同时间复杂度的排序方法。
对东尼·霍尔以及快速排序的提出背景感兴趣的同学,可以看看这篇介绍:http://www.nowamagic.net/librarys/veda/detail/2391
排序思想
快速排序的思路想到很困难,但是理解起来却非常容易
他的思路是这样的:
1、先选定队列中,某一个元素为基数Value(一般选择头元素,或尾元素)。
2、将基数Value依次与所有元素比较大小。按照比较结果将元素分为两个队列A、B。一个所有元素比基数Value大,一个所有元素比基数Value小。
3、将A作为新的队列,再次选定基数,然后分成两个更小的队列
4、就这样一直将每一个小的队列无限的拆分成更小的两个队列。
5、一直到一个队列已经拆分成不能拆封为止(也就是一个元素)
6、因为队列之间的顺序都是固定的。将这些队列一次组合起来,整体的排序就算完成了。
(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )
注意这里有两个最核心的步骤,就是
1、选出Value元素,将整体队列划分成两个子队列
2、然后将子队列重新作为一个新的,整体规模比当前要小的,新的队列,进行计算,直到计算起来非常容易为止。
这两个核心步骤造就了快排天生的优势:
1、通过比较大小划分到子队列中的元素,在未来的比较过程中,这个元素的比较范围始终都停留在这个子队列中,不再做多余的比较。这使得早期的比较对后期的比较仍然有很大的影响。而类似于冒泡的排序方法,则前期很多的比较,对后期的作用非常小。这点和kmp算法很像,前期的比较尽量做到最大的利用。
2、将原有规模的队列,拆分成若干个规模小的子队列,这些子队列要(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )解决的问题与原有队列一致,只是规模变小了。这样不断的拆分,形成一种分而治之的思想。这种思想与背包算法也是不谋而合。
对于文字理解起来有困难的同学,可以看下下边这张网上经典的动态图,非常生动:

下边是java实现的代码
import java.util.Arrays; public class QuickSort
{
public static void main(String args[])
{
QuickSort quicksort = new QuickSort();
int[] arrays = new int[]
{ 1, 12, 2, 13, 3, 14, 4, 15, 5, 16, 17, 17, 177, 18, 8, 8, 19 };
quicksort.quickSort(arrays);
System.out.println(Arrays.toString(arrays));
} private void quickSort(int[] arrays)
{
subQuickSort(arrays, 0, arrays.length - 1);
} private void subQuickSort(int[] arrays, int start, int end)
{
if (start >= end)
{
return;
}
int middleIndex = subQuickSortCore(arrays, start, end);
subQuickSort(arrays, start, middleIndex - 1);
subQuickSort(arrays, middleIndex + 1, end);
} private int subQuickSortCore(int[] arrays, int start, int end)
{
int middleValue = arrays[start];
while (start < end)
{
while (arrays[end] >= middleValue && start < end)
{
end--;
}
arrays[start] = arrays[end];
while (arrays[start] <= middleValue && start < end)
{
start++;
}
arrays[end] = arrays[start];
}
arrays[start] = middleValue;
return start;
}
}
随手编程---快速排序(QuickSort)-Java实现的更多相关文章
- 快速排序算法 java 实现
快速排序算法 java 实现 快速排序算法Java实现 白话经典算法系列之六 快速排序 快速搞定 各种排序算法的分析及java实现 算法概念 快速排序是C.R.A.Hoare于1962年提出的一种划分 ...
- 快速排序QuickSort
前几天实现了直接插入排序.冒泡排序和直接选择排序这三个基础排序.今天看了一下冒泡排序的改进算法,快速排序.单独记录一下,后面还有归并和基数排序等 快速排序 1.选择一个支点默认为数组第一个元素及arr ...
- 归并排序(MergeSort)和快速排序(QuickSort)的一些总结问题
归并排序(MergeSort)和快速排序(QuickSort)都是用了分治算法思想. 所谓分治算法,顾名思义,就是分而治之,就是将原问题分割成同等结构的子问题,之后将子问题逐一解决后,原问题也就得到了 ...
- 快速排序的Java和python实现,亲测实际可用
1.基本思想 快速排序每趟排序确定一个元素x的位置,使用的方式是 将大于元素x的值放大x的右边,小于元素x的值放大x的左边.当确定x的位置之后,再分别对x左边的数组和右边的数组进行快速排序即可. 2. ...
- 快速排序之Java实现
快速排序之Java实现 代码: package cn.com.zfc.lesson21.sort; /** * * @title QuickSort * @describe 快速排序 * @autho ...
- 排序算法四:快速排序(Quicksort)
快速排序(Quicksort),因其排序之快而得名,虽然Ta的平均时间复杂度也是O(nlgn),但是从后续仿真结果看,TA要比归并排序和堆排序都要快. 快速排序也用到了分治思想. (一)算法实现 pr ...
- 算法实例-C#-快速排序-QuickSort
算法实例 ##排序算法Sort## ### 快速排序QuickSort ### bing搜索结果 http://www.bing.com/knows/search?q=%E5%BF%AB%E9%80% ...
- 三、Android NDK编程预备之Java jni入门创建C/C++共享库
转自: http://www.eoeandroid.com/thread-264971-1-1.html 应网友回复,答应在两天前要出一篇创建C/C++共享库的,但由于清明节假期,跟朋友出去游玩,丢手 ...
- 二、Android NDK编程预备之Java jni入门Hello World
转自: http://www.eoeandroid.com/forum.php?mod=viewthread&tid=264543&fromuid=588695 昨天已经简要介绍了J ...
随机推荐
- 实现一个 能在O(1)时间复杂度 完成 Push、Pop、Min操作的 栈
一,问题描述 实现一个栈(元素遵守先入后出顺序),能够通过 min 方法在 O(1)时间内获取栈中的最小元素.同时,栈的基本操作:入栈(Push).出栈(Pop),也是在O(1)时间内完成的. 二,问 ...
- PKUSC2016
day x(x<0) 外出培训倒数第二天晚上发烧了....逃过了第二天早上的考试,orz 抢到rank 1 的commonc神犇!! day 0 下午到了北大,发了两张50元饭卡.这是第三次来北 ...
- Python2 下 Unicode 的一个小bug
关于Python的编码问题已经是老生常谈了,此处主要是介绍一个罕见的问题,也算是Python2的一个bug了(Python3不会有此问题). 在有时候我们去爬取网页或者调用一些第三方库获取文本的时候, ...
- Winform TextBox中只能输入数字的几种常用方法(C#)
方法一: private void tBox_KeyPress(object sender, KeyPressEventArgs e) { ; //禁止空格键 )) return; //处理负数 if ...
- *HDU1142 最短路+记忆化dfs
A Walk Through the Forest Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...
- jQueryMobile引入文件后样式无法正常显示
jQueryMobile引入文件后样式无法正常显示解决方法: jQuery文件必须放在jQueryMobile文件之前 eg:
- Lua输入输出库
1.简单模型 )1.io.write函数: 函数模型为io.write(...) )2.io.read函数: io.read(“*all”) 读取当前输入的整个文件 io.read(”*line“) ...
- bug2--工程性错误
1问题场景:图片上传失败,打印log.http header 有数据.不报错,通过流写入文件后,文件被创建,但是大小为0kb. 执行:df -h 发现linux的磁盘 used 100%. 原来是没有 ...
- swift-重写方法和属性、禁止重写
/*子类可以为继承来的实例方法,类方法,实例属性,或下标提供自己定制的实现.我们把这种行为叫重写. 如果要重写某个特性,你需要在重写定义的前面加上 关键字.这么做,你就表明了你是想提供一个重写 版本, ...
- 怎样解决Myeclipse中运行jsp乱码问题,亲测有效(虽然是个小问题但是为了大家不被网络上的一些乱七八糟的回答坑)不是改什么windows-propories-...............
方法: 在jsp页面中pageEncoding属性值改为UTF-8,指定用UTF-8编码.gbk或者gb18030编码都无效.不是改什么windows-propories-.............. ...