利用快速排序思想求数组第k大元素

来源:互联网 发布:angelababy心机知乎 编辑:程序博客网 时间:2024/05/19 17:08

思路

快速排序中每次排序最后基准点所在的位置j代表它是第j大的元素,只要把j跟k相比,若j小于k,则只要在右半部分查找,等于k直接返回arr[j],否则在左半部分查找。这样算法的时间复杂度为O(n).程序如下:

    public  static int quicksort(int[] arr,int l,int r,int n){        int base = partition(arr,l,r);        if(base == n-1){ //找到第n大元素直接返回            return arr[n-1];        }else if(base<n-1){ //在右半部分查找            return quicksort(arr, base+1, r,n);            }else{ //在左半部分查找            return quicksort(arr, l, base-1,n);        }    }    //返回已经排好的arr[j]索引j    public static int partition(int[] arr,int l,int r){        int v = arr[l];        int i = l+1;        int j = r;        while(true){            while(i<=r && arr[i]<v) i++;            while(j>=l+1 && arr[j]>v) j--;            if(i>j) break;            swap(arr, i, j);            i++;            j--;        }        swap(arr, l, j);        return j;    }    public static int find(int[] arr,int k){        return quicksort(arr,0,arr.length-1,k)    }    public static void main(String[] args) {        int[] test = new int[]{9,2,3,5,1,4,7,6,8,10,2,3};        System.out.println(find(test,4));    }
阅读全文
0 0
原创粉丝点击