减治算法之寻找第K小元素问题
一、问题描写叙述
给定一个整数数列,寻找其按递增排序后的第k个位置上的元素。
二、问题分析
借助类似快排思想实现pation函数。再利用递归思想寻找k位置。
三、算法代码
public static int selectMinK(int [] arr, int low, int high, int k){
int index = pation(arr, low, high);
if(index == k){
return arr[index];
}
if(index < k){
return selectMinK(arr, index + 1, high, k);
}else{
return selectMinK(arr, low, index - 1, k);
}
} public static int pation(int [] arr, int low, int high){
while(low < high){
while(low < high && arr[low] <= arr[high]){//从后往前。把小的元素往前调换
high--;
}
if(low < high){
int tmp = arr[low];
arr[low] = arr[high];
arr[high] = tmp;
low++;
}
while(low < high && arr[low] <= arr[high]){//从前往后。把大的元素往后调换
low++;
}
if(low < high){
int tmp = arr[low];
arr[low] = arr[high];
arr[high] = tmp;
high--;
}
}
return low;//返回low。high相遇位置
}
四、完整測试代码
public class Solution { public static void main(String [] args){
int [] randArr = new int[]{5,2,8,6,3,6,9,7};
int result = selectMinK(randArr, 0, randArr.length - 1, 4);
System.out.print(result);
}
public static int selectMinK(int [] arr, int low, int high, int k){
int index = pation(arr, low, high);
if(index == k){ //若返回的下标为k,则找到目标元素
return arr[index];
}
if(index < k){
return selectMinK(arr, index + 1, high, k);
}else{
return selectMinK(arr, low, index - 1, k);
}
} public static int pation(int [] arr, int low, int high){
while(low < high){
while(low < high && arr[low] <= arr[high]){
high--;
}
if(low < high){
int tmp = arr[low];
arr[low] = arr[high];
arr[high] = tmp;
low++;
}
while(low < high && arr[low] <= arr[high]){
low++;
}
if(low < high){
int tmp = arr[low];
arr[low] = arr[high];
arr[high] = tmp;
high--;
}
}
return low;
}
}
五、执行结果
第4小元素为:6
减治算法之寻找第K小元素问题的更多相关文章
- 寻找第K小元素
要在一个序列里找出第K小元素,可以用排序算法,然后再找.可以证明,排序算法的上界为O(nlogn). 在这里,给出两种可以在线性时间内找出第K小元素的方法. 方法1: (1) 选定一个比较小的阈值(如 ...
- 算法导论 寻找第i小元素 9.2
PS1:如果单纯为做出这道题那么这个代价是O(nlgn),通过排序就可以了. 这里讨论的是O(n)的算法.那么来分析一下这个算法是如何做到O(n)的,算了不分析了,这个推到看起来太麻烦了.其实我想知道 ...
- 快速选择算法/Select 寻找第k大的数
参考算法导论9.3节的内容和这位大神的博客:http://blog.csdn.net/v_JULY_v上对这一节内容代码的实现进行了学习 尝试实现了以查找中位数为前提的select算法. 算法功能:可 ...
- 快速排序以及第k小元素的线性选择算法
简要介绍下快速排序的思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此 ...
- 算法导论学习之线性时间求第k小元素+堆思想求前k大元素
对于曾经,假设要我求第k小元素.或者是求前k大元素,我可能会将元素先排序,然后就直接求出来了,可是如今有了更好的思路. 一.线性时间内求第k小元素 这个算法又是一个基于分治思想的算法. 其详细的分治思 ...
- (寻找第K小的数&&寻找第K小的数的和)
这一篇博客以一些OJ上的题目为载体,讲一下寻找第K小的数的方法 方法一: 先将数据排列好,然后,然后return a[k]或者将前K个数加起来 方法二: 基于高速排序.如,一次高速排序将某一个数放到了 ...
- 中位数与第K小元素
算法实际上是模仿快速排序算法设计出来的,其基本思想也是对输入数组进行递归划分,与快速排序不同的是,它只对划分出来的子数组之一进行递归处理: int randompartition(int a[],in ...
- 清橙OJ 1082 查找第K小元素 -- 快速排序
题目地址:http://oj.tsinsen.com/A1082 问题描述 给定一个大小为n的数组s和一个整数K,请找出数组中的第K小元素. 这是一个补充程序的试题,你需要完成一个函数: int fi ...
- 查询无序列表中第K小元素
当需要在无需列表中寻找第k小的元素时,一个显然的方法是将所有数据进行排序,然后检索k个元素.这种方法的运行时间为O(n log(n)). 无序列表调用分区函数将自身分解成两个子表,其长度为i和n-i. ...
随机推荐
- Dijkstra算法简单实现(C++)
图的最短路径问题主要包括三种算法: (1)Dijkstra (没有负权边的单源最短路径) (2)Floyed (多源最短路径) (3)Bellman (含有负权边的单源最短路径) 本文主要讲使用C++ ...
- nginx 集群
Nginx是什么? Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器.一直纳闷这个X是怎么来 ...
- Python面向对象之文件操作
文件的概念 文件的概念和作用 计算机的文件,就是存储在某种长期存储设备上的一段数据:长期存储设备包括:U盘,硬盘,移动硬盘,光盘,等: 文件的作用:将数据长期保存,在需要的时候使用: 文件的存储方式 ...
- 【Python基础】迭代器、生成器
迭代器和生成器 迭代器 一 .迭代的概念 #迭代器即迭代的工具,那什么是迭代呢? #迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值 while True: #只是单 ...
- STM32——输入捕获实验原理及配置步骤
输入捕获实验原理及配置步骤 一.输入捕获概念 STM32的输入捕获,简单的说就是通过检测 TIMx_CHx (定时器X的通道X)上的 边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定 ...
- ArrayLIst练习之获取满足要求的元素
ArrayListTest2.java import java.util.ArrayList; /* * 1.给定一个字符串数组;{"张三丰","宋远桥",&q ...
- python 中range和xrange的区别
range() 相当于直接构造一个列表,而xrange() 是返回一个迭代值. range用法: range( 开始值,结束值,步长) 在需要大量迭代的时候,比较适合使用xrange()
- 最近切的两题SCC的tarjan POJ1236 POJ2186
两题都是水题,1236第一问求缩点后入度为0的点数,第二问即至少添加多少条边使全图强连通,属于经典做法,具体可以看白书 POJ2186即求缩点后出度为0的那个唯一的点所包含的点数(即SCC里有多少点) ...
- Android Application基本组成部分
Android Application基本组成部分 四个核心的组件 Activity活动,主要用于前台和用户交互,即UI,Activity只是加载一个View而并非一个UI对象 Service服务,主 ...
- oc温习三:常用函数
参考文章: 算术函数 [算术函数] 函数名 说明 int rand() 随机数生成.(例)srand(time(nil)); //随机数初期化int val = rand()P; //0-49之间的随 ...