快速排序

天大地大妈咪最大 提交于 2020-02-26 15:24:25

快速排序可以归结为“挖坑填坑法”。
首先选择一个基准值x(一般选择第一个值),然后用两个指针left指向左端,right指向右端。然后right向前移动,直到遇到nums[right]<x,便将此值赋值给nums[left],然后将left向后移动,遇到大于x的值便放到right的位置,再移动right……直到left==right,最后将x填到相遇处。
这样便完成了小于x的在x左边,大于x的在x右边的排序。然后再分别对左侧和右侧的数组执行这个算法。

 public void quickSort(int[] nums,int left,int right){
        int i = left;
        int j = right;
        if(i<j){
            int x = nums[left];
            while(i<j){
                while(i<j && nums[j]>x){
                    j--;
                }
                if(i<j){
                    nums[i] = nums[j];
                    i++;
                }
                while(i<j && nums[i]<x){
                    i++;
                }
                if(i<j){
                    nums[j] = nums[i];
                    j--;
                }
            }
            nums[i] = x;
            quickSort(nums,left,i-1);
            quickSort(nums,i+1,right);
        }
    }

平均时间复杂度:O(nlogn)
最好空间复杂度:O(logn),每一次都平分数组
最差时间复杂度:O(n),退化为冒泡

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!