您的位置:首页 > 编程语言 > Java开发

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);

        }

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐