利用快速排序思想求数组第k大元素
2017-10-21 11:11
323 查看
思路
快速排序中每次排序最后基准点所在的位置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)); }
相关文章推荐
- 利用快排思想找出数组中第k大的元素
- 利用快速排序思想找出数组中第K大的数
- 利用快速排序的思想寻找乱序数组第k大数
- 基于快速排序思想的随机排列的数组中找第k小的数
- 基于快速排序思想的随机排列的数组中找第k小的数
- 寻找数组中最小的k个数 "利用快速排序的思想"
- 利用快速排序中的切分函数寻找数组主元素
- 分治思想解,选择问题(从给定数组中找第K小的元素)
- 数组中最大第K元素(快排思想)
- 利用快排思想寻找数组中第K大(小)的数字
- 利用随机化的思想求n个元素当中第k小的元素
- 利用快排思想找数组中第K小的数
- 借鉴快速排序的思想,实现算法将整型数组a[0...n]分成两块,使得第一块元素均大于等于0,第二块的元素均小于0,要求算法原地工作且时间复杂度为O(n)
- 从n个元素中找出第K小的数 利用快排的思想来实现
- 数组中元素的大小比较思想
- 利用二维int型数组表达一个矩阵,创建该数组并将其元素打印输出
- 重载运算符 [] 实现寻找数组的第K大的元素
- 基于快速排序寻找第k小元素
- 面试算法:lg(k)时间查找两个排序数组合并后第k小的元素
- 【滴滴笔试】利用快排找到一个无序的数组中的第K大的数