【发布时间】:2017-10-26 18:44:16
【问题描述】:
假设 isAscSorted 函数符合预期(已测试) 我在这里做了一些愚蠢的事情,这就是为什么随机交换永远不会对数组进行排序 - 因为它每次只在不同的数组上进行 1 次交换?
我的测试用例是 int[] values1 = new int[] { 50, 10, 20, 4, 5, 1, 5 };
提示?
public static boolean isAscSorted (int[] arr){
for (int i=0; i<arr.length-1; i++){
if (arr[i]> arr[i+1]){
return false;
}
}
return true;
}
public static boolean swap(int[]a,int i,int j)
{
if (i == j){
return false;
}
int temp=a[i];
a[i]= a[j];
a[j]=temp;
return true;
}
static int randomSort(int[] values) {
//Ok Array is empty or null
if( values == null || values.length==0){
return 0;
}
boolean isSorted = false;
int steps = 0;
Random r = new Random();
int limit = values.length-1; //SOL: should be int limit = values.length;
while (!isAscSorted(values)){
//choose 2 random positions
int r1 = r.nextInt(limit);
int r2 = r.nextInt(limit);
//swap returns true if successful
boolean swapRes = swap(values, r1,r2);
//increment steps counter
if (swapRes)
steps++;
}
return steps;
}
【问题讨论】:
-
如果连续有相同的值,isAscSorted 是否返回 true?
-
对于 { 1, 4, 5, 5,10, 20, 50 }, { 6,6,6,6,6,6,6,6,6,6,6, 返回 true 6,6,6,6,6,6 }
-
while的条件不是错了吗?我的意思是,在对值进行排序时,您应该继续这样做。由于您是在未排序的情况下进行的,因此您的随机算法将花费大量时间来整理它 -
您是如何想到随机排序的?这有点荒谬。首先用小得多的数组进行测试(比如 3 个元素)。也可以尝试使用几乎排序的数组,以增加解决的机会。
-
Piyin 不,循环条件正确。问题在于limit = values.length-1。意味着最终的索引位置永远不会被随机选择,因此无论进行多少次交换,数组都不会被排序。