数据结构和算法

快速排序

2019-03-04  本文已影响0人  Simplelove_f033

应用场景
快速排序 主要是数据量大并且是线性结构
短处
有大量重复数据的时候,性能不好
单向链式结构处理性能不好(一般来说,链式都不使用)
思路int[] arr={31,68,45,90,23,39,54,12,87.76}
其实思想是蛮简单的,就是通过第一遍的遍历(让low和high指针重合)来找到数组的切割点。
假设有
1、第一步:首先我们从数组的left位置取出该数(31)作为基准(base)参照物。


image.png

2、第二步:从数组的high位置向前找,一直找到比(base)小的数,
如果找到,将此数赋给low位置(也就是将12赋给31),
此时数组为:12,68,45,90,23,39,54,12,87.76
low和high指针分别为前后的12。


image.png
3、第三步 此时low角标要向前移动一位 移动到68位置上,high不变
image.png
4、第四步 从数组的low位置向后找,一直找到比(base)大的数,
如果找到,将此数赋给right的位置(也就是40赋给10),
此时数组为:12、68、45、90、23、39、54、68、87、76
low和hiigh指针分别为前后的68。
image.png

5、第五步 :重复“第二,第三 第四“步骤,直到low和high指针重合,
最后low和high角标在45位置上重合
此时的数组为:12、23、45、90、45、39、54、68、87、76


image.png

6、基准(base)参照物值赋值给low和high重合的位置上


image.png

7、第七步、此时31已经潜入到数组的内部,20的左侧一组数都比31小,31的右侧作为一组数都比31大,
以31为切入点对左右两边数按照"第一,第二,第三,第四,第五,第六"步骤进行。就可以把整个数据给排序完成。

代码如下

    //快速排序     31  21  59  68  12  40
        //    x=31
        public static void quickSort(int[] array,int begin,int end){
            if(end-begin<=0) return;
            int x=array[begin];
            int low=begin;//0
            int high=end;//5
            //由于会从两头取数据,需要一个方向
            boolean direction=true;
            L1:
            while(low<high){
                if(direction){//从右往左找
                    for(int i=high;i>low;i--){
                        if(array[i]<=x){
                            array[low++]=array[i];
                            high=i;
                            direction=!direction;
                            continue L1;
                        }
                    }
                    high=low;//如果上面的if从未进入,让两个指针重合
                }else{
                    for(int i=low;i<high;i++){
                        if(array[i]>=x){
                            array[high--]=array[i];
                            low=i;
                            direction=!direction;
                            continue L1;
                        }
                    }
                    low=high;
                }
            }
            //把最后找到的值 放入中间位置
            array[low]=x;
            //开始完成左右两边的操作
            quickSort(array,begin,low-1);
            quickSort(array,low+1,end);
        }
上一篇下一篇

猜你喜欢

热点阅读