java 快速排序算法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34182808/article/details/84445719

  简介

快速排序(quick-sort)算法采用的是分治法策略。首先从要排序的数组中找一个基准,然后将数组中的值分别与基准对比,将大于基准的数值放入基准的一侧,小于基准的数值放入另一侧,因此,数组将会被基准分为两部分。然后再分别对两部分内容选择基准,进行循环迭代,依次达到排序的效果。

通常排序中,在首次循环时,使用数组中的第一个数作为基准,对数组分为两部分,分类之后,基准将处于分界线的位置(也就是第一次排序后,基准的位置一定是正确的,其他的不确定),然后在对两部分分别选择基准,通过迭代进行分类。在每一个排序过程中,唯一能保证的就是基准的位置是正确的。

比如,我们选择{30,40,60,10,20,50}这个数列,在第一次排序时,选择30为基准,排序后的结果为{20,10,30,60,40,50},那么基准30的位置一定是正确的,接着,我们对{20,10,30,60,40,50}剩余的两部分分别选择基准20,60进行排序,产生的结果分别为{10,20}和{50,40,60},其中20,60的位置一定是正确的,所以,{10,20}已经排序完成,同样的道理对{50,40,60}得出结果。整体的排序次序如下(标颜色的为基准的选取)

30,40,60,10,20,50

20,10   ,30,   60,40,50  

10,20,   30,   60,40,50

10,20,   30,   50,40,   60

10,20,   30,   40,50,    60

代码实现

public class QuickSort {

    public static void main(String[] args) {
        Vector<Integer>  vector= new Vector<>();
        vector.add(30);
        vector.add(40);
        vector.add(60);
        vector.add(10);
        vector.add(20);
        vector.add(50);
        QuickSort quickSort = new QuickSort();
        quickSort.sortMethod(vector,0,vector.size()-1);
    }

    /**
     * 快速排序算法.
     * @param vector 需要排序的数组
     * @param left 数组的左边界
     * @param right 数组的右边界
     * @return
     */
    private  Vector<Integer> sortMethod(Vector<Integer> vector,int left,int right){

        //当右侧大于左侧时,不进行检测
        if(right>left){
            int leftCur = left;
            int rightCur = right;
            int cur = vector.get(left);
            while(rightCur>leftCur){

                //从右向左找小于cur的数
                while(rightCur>leftCur&&vector.get(rightCur)>cur){
                    rightCur--;
                }
                if(rightCur>leftCur){
                    vector.set(leftCur++,vector.get(rightCur));
                }

                //从左向右找大于cur的数
                while (rightCur>leftCur&&vector.get(leftCur)<cur){
                     leftCur++;
                }
                if(rightCur>leftCur){
                    vector.set(rightCur--,vector.get(leftCur));
                }
            }
            vector.set(leftCur,cur);
            //打印输出排序的内容
            vector.forEach(a-> System.out.print(a+","));
            System.out.println();
            //递归调用
            sortMethod(vector,left,leftCur-1); //对左半部分进行排序
            sortMethod(vector,leftCur+1,right); //对右半部分进行排序
        }
        return vector;
    }
}

输出结果

20,10,30,60,40,50,
10,20,30,60,40,50,
10,20,30,50,40,60,
10,20,30,40,50,60,

小结

1、快速排序算法的时间复杂度在最坏的情况下是O(n^2),平均复杂度为lg(N+1).

2、快速排序算法不属于稳定排序算法.

参考文献

1、【数据结构与算法】 通俗易懂讲解 快速排序

 

猜你喜欢

转载自blog.csdn.net/qq_34182808/article/details/84445719