(快排实例)查询一个数组中第n大的元素
来源:互联网 发布:js遍历二维数组 编辑:程序博客网 时间:2024/05/22 15:59
package cyd;/** * 查询一个数组中第n大的元素 * 借用了快速排序的思想, * 我先选定一个标定值 然后将数组等分小于这个数的放在左边 大于的放在右边 这时标定值的位置是正确的 我们将它返回去 跟我们的n比较 * 如果返回值大于n我们 就只需要查左边的数据 如果小于n 就只需要查右边的数据 然后递归求解 即可 * * 只需要O(2n) 的时间复杂度 就能查到想要的结果 * 复杂度 = n + n/2 + n/4 +n/8 ... = O(2n) * @author 1 * */public class SelectNum {public static void main(String[] args) {int[] arr = randomArr(1000, 0, 1000);int quickSortgetNum = quickSortgetNum(arr,20);System.out.println(quickSortgetNum);}//快速排序public static int quickSortgetNum(int[] arr,int n){return __quickSort(arr , 0, arr.length - 1,n -1 );}//递归实现快速排序 //每次找到当前的中间值,然后等分左右,再继续从左右依次这样做 就实现了快速排序private static int __quickSort(int[] arr, int l, int r, int n) {int p = __partition(arr, l, r);System.out.println(p+"-----"+arr[p]);//递归求解if(p > n){return __quickSort(arr, l, p - 1, n);}else if(p < n){return __quickSort(arr, p + 1, r, n);}else{return arr[p];}}//快速排序核心private static int __partition(int[] arr, int l, int r) {//这是标准位置的值,最后排序完成左边的比这小右边的比这大//初始版本 取第一个元素 ,但是有一个弊端 如果 数组本身近乎有序,那么大于当前值的就会非常多,导致右侧元素多,就会导致快速排序退化成O(n^2)级别的排序//int p = arr[l];//改进 从 l 到 r 中随机取 一个数 与 起始位置交换作为起始位置,这时 就不会出现这种情况了swap(arr, l , (int) (Math.round((Math.random()*(r - l) + l))));int p = arr[l];int j = l;for(int i = l + 1; i <= r; i++){if(arr[i] < p){swap(arr, i , j + 1);j++;}}swap(arr, j , l);return j;}//输出 public static void printArr(int[] arr){ for(int i = 0; i < arr.length; i++){ if(i != arr.length - 1){ System.err.print(arr[i]+","); }else{ System.err.println(arr[i]); } } } /** * 生成随机数 * @param size * @param rangeL * @param rangeR * @return */ public static int[] randomArr(int size, int rangeL, int rangeR){ if(rangeL >= rangeR){ return null; } int arr[] = new int[size]; for(int i = 0; i < size; i++){ arr[i] = (int) (Math.round((Math.random()*(rangeR - rangeL ) + rangeL))); for(int j = 0; j <=i; j++ ){ if(i != j){ if(arr[i] == arr[j] ){ i--; break; } } } } return arr; } public static boolean isSortArr(int[] arr){ for(int i =0 ; i < arr.length - 1; i++){ if(arr[i] > arr[i + 1]){ return false; } } return true; } //交换 public static void swap(int arr[], int leftNum, int rightNum){ int temp = arr[leftNum]; arr[leftNum] = arr[rightNum]; arr[rightNum] = temp; }}
阅读全文
0 0
- (快排实例)查询一个数组中第n大的元素
- 利用快排思想找出数组中第k大的元素
- 数组中最大第K元素(快排思想)
- 使用快排思想 求第n大的值
- 【滴滴笔试】利用快排找到一个无序的数组中的第K大的数
- 快排应用-第k大元素
- 求数组中第n大(小)的元素
- 20170927_快排应用_数组中寻找第K大的数字
- 寻找无序数组中第k大的数——快排思想
- 寻找一个序列中第n大的元素
- 基于快排 查找数组中出现三次的元素(***)
- 从n个元素中找出第K小的数 利用快排的思想来实现
- N个元素数组中第K大元素
- 求一个整数数组中第N大的数
- 一个无序数组中第K大的元素
- K:找寻数组中第n大的数组元素的值的三个算法
- 【ACdream OJ 1099 - 瑶瑶的第K大 (输入优化+手写O(n)快排)】
- 数组中第K大的元素
- 聚类FCM算法
- docker 安装mongodb
- 方向梯度直方图(HOG,Histogram of Gradient)学习笔记二 HOG正篇
- codevs1069 luogu1525 关押罪犯
- 对待棘手bug,新手与大牛的差距在哪里?
- (快排实例)查询一个数组中第n大的元素
- 小程序文档整理之 -- 快速上手
- Elasticsearch 1.4安装marvel
- JS 和 Java 中URL特殊字符编码方式
- 行为识别笔记:iDT算法用法与代码解析
- 使用AlloyFinger(移动端点触插件)
- MySQL 触发器简单实例
- XtraReport显示行序号
- linux下vi命令大全