这个问题数据结构与算法分析java语言描述版,第二章的2.8课后习题的。下面我的三种不同的实现:
随机数生成函数
public static int randInt(int i, int j) {
int temp = (int) (Math.random() * j + i);
return temp;
}
1.时间复杂度为O(n^2)
public static int[] randArray(int[] arr) {
for (int i = 0; i < arr.length; i++) {
arr[i] = randInt(0, arr.length);
for (int k = 0; k < i; k++) {
if (arr[k] == arr[i]) {
arr[i] = randInt(0, arr.length);
k = -1;
}
}
}
return arr;
}
2.时间复杂度为O(n)
/**
* 用一个中间数组,来表示随机数是否已经使用
*
*/
public static int[] randArray1(int[] arr) {
int[] temp = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
arr[i] = randInt(0, arr.length);
while (temp[arr[i]] == 1) {//重复赋值,
arr[i] = randInt(0, arr.length);
}
temp[arr[i]] = 1;
}
return arr;
}
3.时间复杂度O(n)
//思想是数组已经赋值,通过随机函数交换里面数的位置
public static int[] randArray2(int[] arr) {
for(int i = 0 ; i < arr.length; i++){
arr[i] = i ;
}
for(int i = 1 ; i < arr.length ; i++){
swap(arr,i,randInt(0, i));
}
return arr;
}