三段分割法快排改造的快速分割求第K大

寻找第K大

http://www.nowcoder.com/questionTerminal/e016ad9b7f0b45048c58a9f27ba618bf

public int[] MySort (int[] arr) {
        quickSort(arr,0,arr.length-1);    
        return arr;
    }
    // 改进后的快排
    public void quickSort(int[] arr,int left ,int right){
        //快排
        //判断是否能进入快排
        if(left < right){
            //找到枢纽元
            int pivot = findPivot(arr,left,right);
            int i = left , j = right-1;
            //开始分割数组 ,right的值此时一定比枢纽元大 right-1是枢纽元
            while(true){
                 //刚开始想了想 感觉这里会越界 ,然后突然想起
                //左边界和右边界已经被left 和 right 定死了, i和j都不会越界
                 while(arr[++i] < pivot);
                 while(j>left && arr[--j] > pivot);
                 if(i<j){
                    swap(arr,i,j);
                 }else{
                     break;
                 }
            }
            //还原枢纽元
            if(i<right){
               swap(arr,i,right-1);
            }
            //递归左边数组排序
            quickSort(arr,left,i-1);
            quickSort(arr,i+1,right);

        }
    }  
    //三等分割字符函数
    public int findPivot(int[] arr,int left ,int right){

        int center = left+(right-left)/2;   
        if(arr[left] > arr[center]){
            swap(arr,left,center);
        }
        if(arr[left] > arr[right]){
            swap(arr,left,right);
        }
        if(arr[center] > arr[right]){
            swap(arr,center,right);
        } 
        //这里取头尾中 三个位置的数据排序好 还可以减少快排时一步操作 ,right已经在center后面了
        swap(arr,center,right-1);
        return arr[right-1];
    }
    //交换函数
    public void swap(int[] arr,int n1,int n2){
        int tmp = arr[n1];
        arr[n1] = arr[n2];
        arr[n2] = tmp;
    }
全部评论

相关推荐

废铁汽车人:秋招真是牛鬼蛇神齐聚一堂
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务