快速排序

 

 

 

 

 

 

class Solution {
    //quickSort函数
    public static void quickSort(int[] arr,int l,int r){
        if(l>=r)
        {
            return ;
        }
        int p=partition(arr, l, r);         //找到分界点的下标位置
        quickSort(arr,l,p-1);
        quickSort(arr,p+1,r);
    }
    //partition函数,找到第一个元素在数组中的位置,将数组分成两块
    public static int partition(int[] arr,int l,int r)
    {

//随机生成一个下标,用来作为这个初始的l,将它与l下标的元素交换一下,再将l位置作为我们的v
//这对于防止快速排序算法退化为O(N2)级别的算法是有效的,但是在leetcode上提交的时候时间会增大很多。       
        Random m=new Random();
        int k= m.nextInt(r-l)+l;
        int tp=arr[k];
        arr[k]=arr[l];
        arr[l]=tp;
        
        
        //将随机化过后的第一个l位置的元素作为我们选择好的v
        int v=arr[l];
        int j=l;
        for(int i=l+1;i<=r;i++)
        {
            if(arr[i]<v)
            {
                int temp=arr[j+1];
                arr[j+1]=arr[i];
                arr[i]=temp;
                j++;
            }
        }
        int temp=arr[j];
        arr[j]=v;
        arr[l]=temp;
        return j;
    }
    public int[] sortArray(int[] nums) {
        quickSort(nums,0,nums.length-1);
        return nums;
    }
}

posted @ 2019-07-15 09:24  小路不会迷路  阅读(229)  评论(0编辑  收藏  举报