【算法】求数列中的第1~k小元素

  1.问题描述

设计算法实现在一个具有在n各互不相同元素的数组A[1n]中找出所有前k个最小元素的问题,这里k不是常量,即它是输入数据的一部分。要求算法的时间复杂性为Θ(n)

2. 具体要求

输入的第一行是一个正整数m,表示测试例个数。接下来几行是m个测试例的数据,每个测试例的数据由三行组成,其中其中,第一行输入一个正整数n,表示元素的个数;第二行输入n个整数,整数之间用一个空格隔开。第三行输入一个正整数k,表示求该组测试例中的前k个最小元素。(设给出的每个整数序列中的元素是唯一的。)

输出:对于每个测试例输出一行,由k个整数组成,表示输入的n个整数中前k个最小元素整数之间用一个空格隔开。两个测试例的输出数据之间用一个空行隔开。

说明:限于Acm平台,要求输出数据按从小到大排序。算法的时间复杂性也相应地放宽要求。

3. 测试数据

输入:

2

19

56 34 22 7 16 95 46 37 81 12 73 26 19 31 68 42 3 72 51

8

26

8 33 28 17 51 57 49 35 11 25 37 14 3 2 13 52 12 6 2 32 54 5 16 22 23 7

13

输出:

 3 7 12 16 19 22 26 31

2 3 5 6 7 8 11 12 13 14 16 17 22

4、程序实现(java)

  1import java.io.*;
  2public class Ex3_2
  3{
  4    public static void main(String[] args) throws Exception
  5    {
  6        Ex3_2 yeyunce=new Ex3_2();
  7        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
  8        System.out.println("请输入测试例个数:");
  9        String str=br.readLine();
 10        int m=Integer.parseInt(str);
 11        yeyunce.Test(m);
 12        
 13    }

 14    public void Test(int m)
 15    {
 16        int[][] is=new int[m][100];
 17        int[] r=new int[m];
 18        for(int i=0;i<m;i++)
 19        {
 20            try
 21            {
 22                BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
 23                System.out.println("总测试例个数为"+m+",现请输入第"+(i+1)+"个用例数组的元素个数,在下一行列出,再接着一行输出要求的最小元素个数:");
 24                String str=br.readLine();
 25                int d=Integer.parseInt(str);
 26                String str2=br.readLine();
 27                String[] str3=str2.split(" ");
 28                int[] ii=new int[d];
 29                for(int j=0;j<d;j++)
 30                {
 31                    ii[j]=Integer.parseInt(str3[j]);
 32                }

 33                String str4=br.readLine();
 34                int k=Integer.parseInt(str4);
 35                r[i]=k;
 36                if((k>0)&&(k<=d))
 37                {
 38                    qs(ii,0,d-1,k);
 39                    for(int t=0;t<k;t++)
 40                    {
 41                        is[i][t]=ii[t];
 42                    }

 43                }

 44                else if(k>d)
 45                {
 46                    System.out.println("前k小元素个数不能大于数组长度!");
 47                }

 48                System.out.println();
 49            }

 50            catch(IOException e)
 51            {
 52                System.out.println(e);
 53            }

 54        }

 55        System.out.println("结果为:");
 56        for(int p=0;p<m;p++)
 57        {
 58            System.out.println();
 59            for(int q=0;q<r[p];q++)
 60            {
 61                System.out.print(is[p][q]+" ");
 62            }

 63            System.out.println();
 64        }

 65        System.out.println();
 66    }

 67    public static void qs(int[] data,int left,int right,int k)
 68    {
 69        int i=0;
 70        int j=0;
 71        if(left<right)
 72        {
 73            i=left+1;
 74            while(data[i]<data[left])
 75            {
 76                if(i+1>right)
 77                {
 78                    break;
 79                }

 80                i++;
 81            }

 82            j=right;
 83            while(data[j]>data[left])
 84            {
 85                j--;
 86            }

 87            while(i<j)
 88            {
 89                int temp=data[i];
 90                data[i]=data[j];
 91                data[j]=temp;
 92                i++;
 93                while(data[i]<data[left])
 94                {
 95                    i++;
 96                }

 97                j--;
 98                while(data[j]>data[left])
 99                {
100                    j--;
101                }

102            }

103            int temp=data[left];
104            data[left]=data[j];
105            data[j]=temp;
106            if(j-left+1>k)
107            {
108                qs(data,left,j-1,k);
109            }

110            else if(j-left+1<k)
111            {
112                qs(data,j+1,right,k-j-1);
113            }

114        }

115    }

116}
5、运行结果
运行结果

posted on 2009-04-11 20:07 intrl 阅读(1727) 评论(0)  编辑 收藏 引用 所属分类: 数据结构与算法

只有注册用户登录后才能发表评论。
<2009年4月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

导航

统计

随笔分类(55)

随笔档案(34)

网址收藏

资源下载

随笔导航

搜索

最新评论

阅读排行榜

评论排行榜