使用Partition方法找数组的中位数
来源:互联网 发布:mac上能玩的足球游戏 编辑:程序博客网 时间:2024/05/14 21:26
使用Partition方法找数组的中位数
假如现在有一个长度为奇数的数组 {49, 38, 65, 97, 76, 13, 27, 49, 100}
现在想找到这个数组的中位数。
思路1:
先对数组进行排序,排序后的结果是{13, 27, 38, 49, 49, 65, 76, 97, 100},中位数就是数组中下标为n/2的数(49)。排序的时间复杂度最好是O(nlogn),空间复杂度O(1)。
思路2:
由于我们的目标是找到中位数,不需要把每一个数都排好序,因此还有优化的空间。除了排序以外,我们还可以用快排中的Partition思想。
首先,随机选取一个数作为分类的标准,比它小的都放在它左边,比它大的都放在它右边。
如果这个数的下标刚好是n/2 ,那么这个数就是中位数;
如果这个数的下标小于n/2,说明中位数在它的右边;
如果这个数的下标大于n/2,说明中位数在它的左边
这是一个典型的递归过程~
Java代码如下:
public int findMiddleByPartition(int[] array, int left, int right) { int i = left, j = right; int key = array[left]; while(i < j) { // j向左走,直到找到一个小于key的数 while(i < j && array[j] >= key) j--; if(i < j) { array[i] = array[j]; i++; } // i向右走,直到找到一个大于key的数 while(i < j && array[i] <= key) i++; if(i < j) { array[j] = array[i]; j--; } } array[i] = key; if(i == array.length / 2) { return i; }else if(i < array.length / 2){ return findMiddleByPartition(array, i + 1, right); }else { return findMiddleByPartition(array, left, i - 1); }}
附 一次快排过程
阅读全文
0 0
- 使用Partition方法找数组的中位数
- 找两个有序数组的中位数
- 找两个排序数组的中位数
- 2-找两个有序数组的中位数
- 无序数组找中位数
- 有序数组中找中位数
- 有序数组中找中位数
- 找两个有序数组的中位数的几种方式
- 【雅虎笔试题】两个已经排好序的数组,找中位数
- 【雅虎笔试题】两个已经排好序的数组,找中位数
- 用线性时间选择来找无序数组的中位数
- (p125)9.3-8找两个数组元素的中位数
- 找滑动窗口的中位数
- leetcode 4两数组找中位数
- 找中位数
- 找中位数
- 两个数组的中位数
- 无序数组的中位数
- 对象的方法
- 1. tomcat下solr服务器的安装
- CNN(卷积神经网络)、RNN(循环神经网络)、DNN(深度神经网络)的内部网络结构有什么区别?
- C/C++中const关键字详解
- 【0057】netbean for java ee安装教程
- 使用Partition方法找数组的中位数
- VMware下Ubuntu与宿主机简单共享文件夹
- android简易流式布局
- C++ 指针与数组的练习
- webUI自动化测试框架(四):代码分层-操作层及用例层
- 深入解析C++中的mutable关键字
- 使用Eclipse上传/下载Git项目
- Linux中的文件描述符(fd)与打开文件之间的关系
- CommonTextView的使用