快速排序——Java

快速排序是一种很优秀的经典排序算法。
下面是Java代码实现,注意枢纽元的选择!

/**
     * 快速排序基于分治的思想,同时,此处选取枢纽元也有一定讲究,并不是你经常看见的直接选取最左边或者最右边的元素
     * 作为枢纽元。而是采用更为“安全”的方式。你可以这样理解:如果使用快速排序的数组已经是有序的,那么此时依旧采用
     * 原始的枢纽元选取,时间效率将急剧下降(O(N^2)).
     */
    public static void quickSort(int arr[],int left,int right) {
        //递归结束条件
        if(left>=right)return;
        int mid=(left+right)/2;
        //由三个数取中位数来作为枢纽元,可以在某些极端情况下(如已经排序)提高效率
        int val=getMidVal(arr[left], arr[right],arr[mid]);
        int i=left,j=right;
        while(i<j) {
            //找到大于枢纽元下标
            for(;i<=right;i++) {
                if(arr[i]>=val)break;
            }
            //找到小于枢纽元下标
            for(;j>=left;j--) {
                if(arr[j]<val)break;
            }
            //交换元素
            if(i<j) {
                int temp=arr[j];
                arr[j]=arr[i];
                arr[i]=temp;
            }
        }
        //最后将枢纽元与i的位置交换
        arr[i]=val;
        //分解子问题(一般递归)
        quickSort(arr, left, i);
        quickSort(arr, i+1, right);
    }
    //找到枢纽元,中位数
    public static int getMidVal(int a,int b,int c) {
        int t[]= {a,b,c};
        Arrays.sort(t);
        return t[1];
    }

同时附上50万随机数排序速度比较(单位ms):
快速排序用时:117
归并排序用时:115
选择排序用时:155848

猜你喜欢

转载自blog.csdn.net/zwzsdy/article/details/80064495