1到N的整数中,随机选出M个并升序排列的较高效算法

来源:互联网 发布:孙笑侠 知乎 编辑:程序博客网 时间:2024/06/05 18:33
/** * 从1到N的整数中,选出M个,按小到大排序存入数组 * @author rorom * @param n * @param m * @return */public int[] nInM(int n,int m){if(n<0||m<0||n<m) return null;//范围控制if(m==0) return new int[0]; int tab = 0;//交换暂储空间int k = n;//存储随机选中值的数组下标int[] all = new int[n];//将符合规则的数据载满数组for(int i=0;i<n;i++){all[i]=i+1;}//全选的话,就直接返回吧if(m==n) return all;int[] returnArr = new int[m];Random random = new Random();//要选多少号码就循环多少次while(m-->0){//每次随机获取从0到k(可选值的最后一个)以此为数组下标来获取实际值 int t = random.nextInt(k);//将获取的数移动到数组的最后端备用tab = all[t];all[t]=all[--k];all[k]=tab;//移动到位后进行排序,排序直到交换不了,证明已经排到位,则立即中断for(int i=k;i<n-1;i++){if(all[i]>all[i+1]){tab = all[i];all[i]=all[i+1];all[i+1]=tab;}else{break;}}}//将数据区的数据载入新数组并返回//for(int i=k;i<n;i++){//returnArr[++m]=all[i];//}System.arraycopy(all, k, returnArr, 0, returnArr.length);return returnArr;}

原创粉丝点击