java线性时间寻找第k小元素
2013-11-23 15:01
302 查看
package contcurrentandalgorithm;
import java.util.Random;
/**
*
* @author Administrator
* zyyjiao@mail.ustc.edu.cn
*/
public class SelectKMinAndMax {
public static void main(String[] args) {
int a[] = {2, 3, 4, 1, 5, 10, 9, 7, 8, 6};
int k = 4;
int result = selectKMin(a, 0, 9, k);
//SelectKMinAndMax sl = new SelectKMinAndMax();
//System.out.println(SelectKMinAndMax.selectKMin(a, 0, 9, k));
System.out.println(result);
}
public static void swap(int a[], int i, int j) {
int temp;
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
public static int partion(int a[], int p, int r) {//根据pivot a[r]来划分数组
int pivot = a[r];
int low = p - 1;
int i;
for (i = p; i < r; i++) {
if (a[i] < pivot) {
swap(a, ++low, i);
}
}
swap(a, ++low, r);
return low;
}
public static int RondomPartition(int a[], int p, int r) {
int i;//随机选择一个pivot来划分
Random rd = new Random();
// i = p+(rd)%(r-p+1);
i = rd.nextInt(10);
swap(a, i, r);
return partion(a, p, r);//返回轴位置
}
public static int selectKMin(int a[], int p, int r, int k) {
if (p == r) {
return a[p];
}
int q = RondomPartition(a, p, r);
int count = q - p + 1;//计算 a[p..q]的元素数量
if (k == count)//刚好,返回
{
return a[q];
} else if (k < count)//在前半部分
{
return selectKMin(a, p, q - 1, k);
} else //在后半部分
{
return selectKMin(a, q + 1, r, k - count);
}
}
}
import java.util.Random;
/**
*
* @author Administrator
* zyyjiao@mail.ustc.edu.cn
*/
public class SelectKMinAndMax {
public static void main(String[] args) {
int a[] = {2, 3, 4, 1, 5, 10, 9, 7, 8, 6};
int k = 4;
int result = selectKMin(a, 0, 9, k);
//SelectKMinAndMax sl = new SelectKMinAndMax();
//System.out.println(SelectKMinAndMax.selectKMin(a, 0, 9, k));
System.out.println(result);
}
public static void swap(int a[], int i, int j) {
int temp;
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
public static int partion(int a[], int p, int r) {//根据pivot a[r]来划分数组
int pivot = a[r];
int low = p - 1;
int i;
for (i = p; i < r; i++) {
if (a[i] < pivot) {
swap(a, ++low, i);
}
}
swap(a, ++low, r);
return low;
}
public static int RondomPartition(int a[], int p, int r) {
int i;//随机选择一个pivot来划分
Random rd = new Random();
// i = p+(rd)%(r-p+1);
i = rd.nextInt(10);
swap(a, i, r);
return partion(a, p, r);//返回轴位置
}
public static int selectKMin(int a[], int p, int r, int k) {
if (p == r) {
return a[p];
}
int q = RondomPartition(a, p, r);
int count = q - p + 1;//计算 a[p..q]的元素数量
if (k == count)//刚好,返回
{
return a[q];
} else if (k < count)//在前半部分
{
return selectKMin(a, p, q - 1, k);
} else //在后半部分
{
return selectKMin(a, q + 1, r, k - count);
}
}
}
相关文章推荐
- 在数组A中寻找第k小的元素-最坏情况为线性时间的算法
- 给你一个由n-1个整数组成的未排序的序列,其元素都是1到n中的不同的整数。请写出一个寻找序列中缺失整数的线性时间算法。
- 分治算法;随机化划分函数;快速排序;线性时间选择第K小元素;快速排序平均时间复杂度nlgn;
- 算法导论学习之线性时间求第k小元素+堆思想求前k大元素
- 线性时间查找第k大元素
- 算法导论学习之线性时间求第k小元素+堆思想求前k大元素
- 第九章中位数和顺序统计学 之 “寻找第i小元素之最坏情况线性时间的选择 最坏运行时间就为O(n)算法”
- 线性时间寻找一列无序数中第k大的数
- 在线性时间复杂度内求解第k小元素问题
- 线性时间选择:从n个元素中找出第k小的元素
- 选择问题:线性时间内找到序列的第k小的元素
- 线性时间选择第K小元素(随机化选择第K小元素)C++
- 算法代码实现之选出第k小元素、中位数、最小的k个元素(线性复杂度),Java实现
- 给一个由n-1个整数组成的未排序的序列,其元素都是1~n中的不同的整数。如何在线性时间复杂度内寻找序列中缺失的整数
- 删除一个单项链表的最中间的元素,要求时间尽可能短(不能使用两次循环)java
- O(N)的时间寻找第K大数——Python
- 用快速排序法寻找第k大元素
- LeetCode-162. Find Peak Element (JAVA)寻找peak元素
- [LeetCode题解]从两个有序数组的并集中寻找第k小元素
- 比较 N个元素 一个一个地插入到一个堆中 以线性时间建立一个堆 已排序、反序、随机输入的运行时间