Java排序算法:快速排序
2016-02-18 19:45
253 查看
一.思想:
对冒泡排序算法的一种改进。通过一趟排序将排序的数据分割成两个部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再按此方法对这两部分分别再进行快速排序,依次类推。实现为:
开始时先设两个变量i=Start,j=End;
以第一个元素作为中间点,pivot=num[i];
以j--的形式从后向前搜索,找到第一个比pivot小的,则将num[i] = num[j]
以i++的形式从前向后搜索,找到第一个比pivot大的,则将num[j]=num[i];
不断重复3,4,直到i=j,最后使得num[i]=pivot;
这样就可以把小于pivot的值全部放在pivot前面,把大于pivot的值全部放在pivot后面。
二.例子:
比如5,6,4,2,3,
pivot=5,i=0,j=5。用j--先从后往前开始搜索,发现3<5,则执行num[i]=num[j],执行后序列为3,6,4,2,3,
用i++从前开始搜索,当i=1时num[1]=6<5,执行num[j]=num[i],执行后序列为3,6,4,2,6,
再用j--从后往前搜索,当j=4时,num[j]=2<5,则执行num[i]=num[j],执行后序列为3,2,4,2,6
再用i++从前往后搜索,一直到i=j,没有发现比pivot小的数,则执行num[i]=pivot,此时序列为3,2,4,5,6.
这样一趟循环,就可以以5为分界线,小于5的值全在5左边,大于5的值全部在5右边。
第二趟,第三趟以此类推。
三.实现代码:
四.复杂度与应用:
时间复杂度为:O(nlogn) 空间复杂度为O(1) 是不稳定的排序算法。
应用:一般情况下,该算法是最快的排序算法(某些情况下有比这个算法更快的算法),适用于大部分场合,但是如果数据量巨大,比如说几百万条时,就可能会发生堆栈溢出的错误,所以当数据量巨大的时候,可以考虑堆排序,归并排序等等。
五.参考资料:
追竹的博客:http://blog.csdn.net/apei830/article/details/6586811
百度百科-快速排序:http://baike.baidu.com/view/19016.htm?fromId=115472&fr=wordsearch
六:相关排序代码下载:
包含(冒泡排序,桶排序,堆排序,插入排序,归并排序,快速排序,基数排序,选择排序,希尔排序)
免积分下载地址:http://download.csdn.net/detail/u014077165/7185895
对冒泡排序算法的一种改进。通过一趟排序将排序的数据分割成两个部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再按此方法对这两部分分别再进行快速排序,依次类推。实现为:
开始时先设两个变量i=Start,j=End;
以第一个元素作为中间点,pivot=num[i];
以j--的形式从后向前搜索,找到第一个比pivot小的,则将num[i] = num[j]
以i++的形式从前向后搜索,找到第一个比pivot大的,则将num[j]=num[i];
不断重复3,4,直到i=j,最后使得num[i]=pivot;
这样就可以把小于pivot的值全部放在pivot前面,把大于pivot的值全部放在pivot后面。
二.例子:
比如5,6,4,2,3,
pivot=5,i=0,j=5。用j--先从后往前开始搜索,发现3<5,则执行num[i]=num[j],执行后序列为3,6,4,2,3,
用i++从前开始搜索,当i=1时num[1]=6<5,执行num[j]=num[i],执行后序列为3,6,4,2,6,
再用j--从后往前搜索,当j=4时,num[j]=2<5,则执行num[i]=num[j],执行后序列为3,2,4,2,6
再用i++从前往后搜索,一直到i=j,没有发现比pivot小的数,则执行num[i]=pivot,此时序列为3,2,4,5,6.
这样一趟循环,就可以以5为分界线,小于5的值全在5左边,大于5的值全部在5右边。
第二趟,第三趟以此类推。
三.实现代码:
public class Test{ public static void main(String[] args) { int data[] = {4,3,5,6,7,2,1,2,2}; quickSort(data,0,data.length - 1); printData(data); } private static void printData(int[] data) { for (int i : data) { System.out.print(i + " "); } } private static void quickSort(int[] data,int start,int end) { int i = start; int j = end; int flag = data[start]; while(i < j){ while( (i < j) && (data[j] >= flag) ) j--; data[i] = data[j]; while( (i < j) && (data[i] <= flag) ) i++; data[j] = data[i]; } data[i] = flag; if( (i - start) > 1) quickSort(data, start, i - 1); if( (end - i) > 1) quickSort(data, i + 1, end); } }
四.复杂度与应用:
时间复杂度为:O(nlogn) 空间复杂度为O(1) 是不稳定的排序算法。
应用:一般情况下,该算法是最快的排序算法(某些情况下有比这个算法更快的算法),适用于大部分场合,但是如果数据量巨大,比如说几百万条时,就可能会发生堆栈溢出的错误,所以当数据量巨大的时候,可以考虑堆排序,归并排序等等。
五.参考资料:
追竹的博客:http://blog.csdn.net/apei830/article/details/6586811
百度百科-快速排序:http://baike.baidu.com/view/19016.htm?fromId=115472&fr=wordsearch
六:相关排序代码下载:
包含(冒泡排序,桶排序,堆排序,插入排序,归并排序,快速排序,基数排序,选择排序,希尔排序)
免积分下载地址:http://download.csdn.net/detail/u014077165/7185895
相关文章推荐
- 快速排序
- C#快速排序算法实例分析
- C++快速排序的分析与优化详解
- php简单实现快速排序的方法
- Java 快速排序(QuickSort)原理及实现代码
- 快速排序和分治排序介绍
- java 算法之快速排序实现代码
- Java实现快速排序算法(Quicktsort)
- Java中的数组排序方式(快速排序、冒泡排序、选择排序)
- 快速排序的原理及java代码实现
- C/C++实现快速排序的方法
- c语言实现冒泡排序、希尔排序等多种算法示例
- 深入单链表的快速排序详解
- C++实现八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序等
- JavaScript实现快速排序的方法
- C#使用委托实现的快速排序算法实例
- C语言的冒泡排序和快速排序算法使用实例
- javascript与Python快速排序实例对比
- php实现快速排序的三种方法分享
- PHP两种快速排序算法实例