一 序
打算补一下基础的数据结构,尽量保持每周一篇,后面多了会汇总一下。先从书上的第一章引论的例子开始。
二 实现方法:
2.1 将N个数以排序,输出第n-K个位置上的元素。(或者是递减排序,输出第K个位置)
public class Kmax {
private static final Random r = new Random();
public static void main(String[] args) {
long t1 = System.currentTimeMillis();
int k = r.nextInt(10);
int a[] = new int [1000];
for(int i = 0;i < a.length ;i ++)
{
a[i] =r.nextInt(5000);
}
System.out.println("a[]:"+JSON.toJSON(a));
System.out.println("k="+k);
int result = kmax1(a,k);
System.out.println("pop use:"+(System.currentTimeMillis()-t1));
// int result = kmax2(a,k);
// System.out.println("quicksort use:"+(System.currentTimeMillis()-t1));
}
public static int kmax1(int a[],int k){
int t = 0;
for(int i = 0;i < a.length; i++)
for(int j = 0;j < a.length-1-i; j++)
{
if(a[j+1] > a[j])
{
t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
System.out.println("num="+a[k-1]);
return a[k-1];
}
public static int kmax2(int a[],int k){
Arrays.sort(a);
System.out.println("num="+a[a.length-k]);
return a[a.length-k];
}
}
作为对比, 用了jdk自带的sort.
k=6
num=4949
pop use:7
k=1
num=4990
quicksort use:1
2.2 先把前K个元素读入数组并对其降序顺序排序,再将剩下的元素再逐个读入。当新元素被读到时,如果它小于数组中第K个元素则忽略,否则就将其放到数组的正确位置上,同时将数组的一个元素挤出数组。算法终止时,位于第K个位置上的元素即为所求。(好吧,我有偷懒了,因为jdk没有自带的降序,所以做个临时变量数组b,用来保存前面K个元素,升序排序保证b[0]最小,后面的插入逻辑类似)
public class Kmax2 {
private static final Random r = new Random();
public static void main(String[] args) {
long t3 = System.currentTimeMillis();
int k = r.nextInt(10);
System.out.println("k="+k);
int a[] = new int [1000];
int b[] = new int [k];
for(int i = 0;i < k; i++)
{
a[i] = r.nextInt(5000);
b[i] = a[i];
}
//System.out.println("a[]:"+JSON.toJSON(a));
for(int i = k;i < a.length ;i ++)
{
int tmp =r.nextInt(5000);
a[i] = tmp;
if(tmp>getmin(b)){
b[0] = tmp;
getmin(b);
}
}
//System.out.println("a[]:"+JSON.toJSON(a));
System.out.println("num="+b[0]);
System.out.println("use:"+(System.currentTimeMillis()-t3));
}
public static int getmin(int a[]){
Arrays.sort(a);
return a[0];
}
}
输出结果:
k=8
num=4933
use:1
当然这两种对于大数据量千万级的随机数,效果都很慢。不是最好办法,等后面看到了在补充。