amor详解 快速排序 使用以及心得
这是针对快速排序的详解,可以还不是很清楚,希望大家指正! 原文来自 http://www.liaoguodong.cn 作者 amor 欢迎大家前来!!
前言:快速排序作为专家测试,公认的最快的排序算法,相比冒泡排序,选择排序,插入排序等低级排序而言,是一个优秀的排序算法.对于初学者和兴趣爱好者有着较好的教学目的.在这人,我详解一下快速排序的原理,以及心得
快速排序的原理:
第一步:取第一个值为参考值mid
第二步:设立两个指针(下标),i指向第一个元素,j指向最后一个元素
第三步:从j开始逐步向前找一个小于mid的数与其交换
第四步:从i开始逐步向后找一个大于mid的数与其交换
如果i,j不相遇,那么重复第三步和第四步
快速排序的思想:将一个大的问题划分为一个小的问题,再这个小的问题细分
快速排序之所以快速,首先来说在时间上:快速排序的执行时间为=nlog2N
而低级排序为=n*n
那么就显而易见了,例如一个100个数字,那么低级排序的时间为100*100=10000O
注意O,为时间单位
而同样的100个数字,快速排序的时间为=100*log2100 =700
所以,在时间上,快速排序大大的超过了以往的低级排序速度
此图请结合下面代码一起阅读
下面是代码,使用,测试方法,直接将以下代码,复制,执行就可以了!
- import java.util.Arrays;
- public class 快速排序 {
- public static void fastsort(int []a ,int left,int right){
- /*
- * 快速排序的原理:
- 第一步:取第一个值为参考值mid
- 第二步:设立两个指针(下标),i指向第一个元素,j指向最后一个元素
- 第三步:从j开始逐步向前找一个小于mid的数与其交换
- 第四步:从i开始逐步向后找一个大于mid的数与其交换
- 如果i,j不相遇,那么重复第三步和第四步
- * */
- //取参考值
- int mid = a[left];
- //设定两个指针
- int i=left;
- int j=right;
- /*
- *
- * */
- while(i<j){
- //从j开始向前找一个小于mid的数与其交换 保证i和j不相等
- /*
- * 此处不易懂,所以详细讲解一下。 当a[j]>mid的时候,那么表示此数比mid大,那么这一位不动,然后把j的位置向前移动,然后又判断
- * 当条件不符合的时候表示a[j]<mid,那么就是这个值比参考值要小,那么更进入if判断,和mid交换位置,从而达到mid的左边的值全部比mid大
- * 注意:a[j]>=mid当不等于的时候,那么当数组有等等的数的时候,循环会陷入死循环的位置.切记!!!
- * */
- while(i<j&&a[j]>=mid){
- j--;
- }
- if (i<j) {
- int b=a[i];
- a[i]=a[j];
- a[j]=b;
- }
- /*
- * 此处同上,保证mid右边的值全部比mid小
- *
- * */
- //从i开始向后找一个大于mid的数与其交换
- while(i<j&&a[i]<=mid){
- i++;
- }
- if (i<j) {
- int b=a[i];
- a[i]=a[j];
- a[j]=b;
- }
- }
- /*
- * 例如:原数组为int[] a={5,1,7,9,3,2,4,6,8};
- * 那么在这人的排序后,会变成 5居中,1,3,2,4在5的右边,但是不一定是有顺序的,,只能保证5的右边都比5小,那么,左边同理
- * */
- //i j相遇,就以mid为断点,左边的全小,右边全大
- //左边有数才快速排序
- if(left<i){
- /*在这儿使用了递归,自己调用自己的方法,当i和j相等时候就表示已经完成了排序
- * */
- fastsort(a, left, i-1);
- }
- if(j<right){
- fastsort(a, j+1, right);
- }
- }
- public static void main(String[] args) {
- int [] a={4,5,5,3,2,4,6,7,9,3};
- // int[] a={5,1,7,9,3,2,4,6,8};
- /*
- * Arrays.sort(a);这是一个比较简单的排序方式,但是原理仍然是使用的快速排序,只是被封装了而已
- * */
- // Arrays.sort(a);
- fastsort(a, 0, a.length-1);
- for(int i=0;i<a.length;i++){
- System.out.print(a[i]+"\t");
- }
- }
- }
这是针对快速排序的详解,可以还不是很清楚,希望大家指正! 原文来自 http://www.liaoguodong.cn 作者 amor 欢迎大家前来!!
转载于:https://blog.51cto.com/6296322/1086911