减治算法之寻找第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. ...
随机推荐
- API对接中经常会出现的签名获取,这只是某一种,仅供给有需要的人参考
要求: 1.对所有传入参数(含系统参数和接口参数)按照字段名的 ASCII 码从小到大排序(字典序)后,使用 URL 键值对的格式.(即 key1=value1&key2=value2…)拼接 ...
- [MVC][Shopping]Copy Will's Code
数据模型规划(Models) //DisplayNameAttribute 指定属性的显示名称 [DisplayName("商品类别")] //DisplayColumnAttri ...
- Python模块学习 - openpyxl读写excel
openpyxl模块介绍 openpyxl模块是一个读写Excel 2010文档的Python库,如果要处理更早格式的Excel文档,需要用到额外的库,openpyxl是一个比较综合的工具,能够同时读 ...
- 一个可以获取知乎timeline的爬虫
# -*- coding: utf-8 -*- import requests import lxml import os,time from bs4 import BeautifulSoup as ...
- .net对象的生命周期
阅读了文章:.NET对象生命周期小结 文章分多个部分,第一部分:介绍了,创建对象时,内存的分配,对象真正被创建,以及经历各阶段垃圾回收的过程. 第二部分,介绍了Finalize与Dispsose方法.
- C# easyui json类
using System; using System.Data; using System.Text; namespace Common { public class JsonHelp { priva ...
- [vijos1246]文科生的悲哀(二)
[vijos1246]文科生的悲哀(二) 试题描述 化学不及格的Matrix67无奈选择了文科.他必须硬着头皮艰难地进行着文科的学习. 这学期的政治.历史和地理课本各有n章.每一科的教学必须按章节从前 ...
- hdu 2669 扩展欧几里得(裸)
#include<stdio.h> #include<iostream> #define ll __int64 ll gcd(ll a,ll b,ll &x,ll &a ...
- 在RedHat 5下安装Oracle 10g详解(转)
在RedHat 5下安装Oracle 10g详解(转) Posted on 2012-09-14 13:26 疯狂 阅读(5075) 评论(0) 编辑 收藏 所属分类: database .uni ...
- 指针与数组的对比(——选自:C++内存管理技术内幕)
数组: 数组要么是在静态存储区上创建(如全局数组),要么是在栈上创建的.数组名代表着 段连续的内存,其地址和容量在生命周期内是不会改变的,而只能改变其数组内容. 指针: 指针是一种指针类型的变量,变量 ...