这类为题可以抽象为随机生成K个 1~N之间不同的整数。
解决思路:
a,选中第1个元素,将其与n个元素中的任意一个交换(包括第1个元素自己)。这时排序后的第1个元素已经确定。
b,选中第2个元素,将其与n-1个元素中作任意一个交换(包括第2个元素自己)。
c,重复上面步骤K次
实现代码:
#include<iostream>
#include<ctime>
#include<cstdlib>
#include<cstdio>
using namespace std;
int main(){
int n,k;
cin>>n>>k;
if(n>k){
int *nums = new int[n];
for(int i =0;i<n;i++) nums[i] = i+1;
for(int i =0;i<k;i++){
int index = i+rand()%(n-i); //生成一个 [j,n)的随机数
int t = nums[i];
nums[i] = nums[index];
nums[index] = t;
}
cout<<"random result:";
for(int i =0;i<k;i++)
cout<<nums[i]<<" ";
}
return 0;
}
这个其实就是Fisher-Yates shuffle详细资料可以参考: https://en.wikipedia.org/wiki/Fisher–Yates_shuffle