快速排序

思想:将一个数组选第一个元素作为基准元素pivot,然后先从右向左遍历,找到比pivot小的元素a[小]后赋值给左边第一个元素a[左],然后从左向右依次遍历找到比pivot大的元素a[大],然后放到刚刚a[小]的位置,这时,大的放到了右边,小的放到了左边,再将pivot的值赋值给a[大],这样就完成了依次以pivot为基准,左边的元素比pivot小右边比pivot大的排序。然后再用这个方法分别对左右的子数组进行排序,以此类推。。。

java代码
public static void quick_sort(int[] a,int L,int R){
        if (L>=R)return;
        int i = L, j=R, pivot = a[L]; //左边第一个元素作为基准元素
        while (i<j){
            //从左向右遍历,找到比基准小的元素
            while (i<j && a[j]>=pivot) j--;
            //找到比左边第一个小的元素,赋值
            a[i] = a[j];
            System.out.println("a[" + i + "]:" + a[i]);
            //从右向左遍历,找到比基准大的元素
            while (i<j && a[i] <= pivot)i++;
            a[j] = a[i];
            //完成依次循环,将比基准大的元素放到了j,比基准小的元素放到了i
            System.out.println("a[" + j + "]:" + a[j] );

        }
        a[i] = pivot;
        System.out.println("a[" + i + "]:" + a[i]);
        System.out.println(Arrays.toString(a));
        quick_sort(a,L,i-1);
//        System.out.println("左边数组排序:"+Arrays.toString(a));
        quick_sort(a,i+1,R);
//        System.out.println("右边数组排序:"+Arrays.toString(a));
 }


    public static void main(String[] args) {
        quick_sort(new int[]{3, 5, 2, 1, 8, 0, 6},0,6);
    }
打印结果
a[0]:0
a[5]:5
a[1]:1
a[3]:1
a[3]:3
[0, 1, 2, 3, 8, 5, 6]
a[0]:0
a[0]:0
a[0]:0
[0, 1, 2, 3, 8, 5, 6]
a[1]:1
a[1]:1
a[1]:1
[0, 1, 2, 3, 8, 5, 6]
a[4]:6
a[6]:6
a[6]:8
[0, 1, 2, 3, 6, 5, 8]
a[4]:5
a[5]:5
a[5]:6
[0, 1, 2, 3, 5, 6, 8]

平均时间复杂度:O(nlog₂n)
最坏时间复杂度:O(n²)
最好时间复杂度:O(nlog₂n)
空间复杂度: O(log₂n)
稳定性: 不稳定

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容