gie*_*ops 1 java sorting random algorithm
我有一个名为的数组arr,有15个元素的位置.我需要将数字1到15以随机顺序放入该数组中.这是我尝试过的:
int[] arr = new int[15];
int i,j,k,n;
for (i = 0; i<15; i++) {
for (j=0; j<15; j++) {
n = (int)(Math.random() * 14 + 1);
if (rij[j] != n) {
rij[i] = n;
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢!:)
这看起来像是家庭作业(或面试问题?).如果是这种情况,并且您需要使用数组而不是使用Java Collection Objects的内置方法(或者即使不是,实际上),答案是Fisher-Yates Shuffle算法
现代的就地洗牌是:
To shuffle an array a of n elements (indexes 0..n-1):
for i from n ? 1 downto 1 do
j ? random integer with 0 ? j ? i
exchange a[j] and a[i]
Run Code Online (Sandbox Code Playgroud)
(我必须检查,但我怀疑这是Java在其shuffle()方法中使用的方法).
编辑因为实现算法很有趣:
在java中,这将是:
public static void main(String[] args) {
int[] a = new int[15];
for (int i = 1; i <= 15; i++)
{
a[i-1] = i;
}
Random rg = new Random();
int tmp;
for (int i = 14; i > 0; i--)
{
int r = rg.nextInt(i+1);
tmp = a[r];
a[r] = a[i];
a[i] = tmp;
}
for (int i = 0; i < 15; i++)
System.out.print(a[i] + " ");
System.out.println();
}
Run Code Online (Sandbox Code Playgroud)
并且......这可以使用内部版本的算法进一步优化,因为您希望以随机顺序插入已知的一系列数字.以下是实现您所要做的事情的最佳方式,因为没有创建额外的副本,例如创建ArrayList并将其复制回数组时.
a = new int[15];
Random rg = new Random();
for (int i = 0; i < 15; i++)
{
int r = rg.nextInt(i+1);
a[i] = a[r];
a[r] = i+1;
}
Run Code Online (Sandbox Code Playgroud)
像这样做
// Create an ordered list
List<Integer> list = new ArrayList<Integer>();
for (int i = 1; i < 16; i++) {
list.add(i);
}
// Shuffle it
Collections.shuffle(list);
// Get an Integer[] array
Integer[] array1 = list.toArray(new Integer[list.size()]);
// Get an int[] array
int[] array2 = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
array2[i] = list.get(i);
}
Run Code Online (Sandbox Code Playgroud)