【问题标题】:Random Sort does not terminate随机排序不会终止
【发布时间】: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。意味着最终的索引位置永远不会被随机选择,因此无论进行多少次交换,数组都不会被排序。

标签: java sorting random


【解决方案1】:

该错误与使用随机有关。 我已经指出 int limit = values.length-1; 这意味着最后一个数组位置永远不会交换,因此数组永远不会被排序(除非第二个和最后一个数字相同且最大)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-24
    • 2017-12-15
    • 1970-01-01
    • 2012-12-04
    • 2017-04-06
    • 2012-11-19
    • 1970-01-01
    • 2012-03-16
    相关资源
    最近更新 更多