随机选择算法

时间:2014-10-15 00:10:14

标签: java arrays algorithm random

我正在尝试实现一个随机选择算法,其中数组填充了随机数,用户选择一个位置,程序返回的值与数组的排序版本中的位置一致,而不实际排序数组。 / p>

问题是程序在给定位置给出了元素的值,但是在未排序的数组中。

import java.util.*;

public class RandomizedSelection {

    public static void main(String[] args) {
        int maxSize = 10; // max size of the array
        int[] arr = new int[maxSize];

        // fill array with random numbers between the range of 0-200
        for (int i = 0; i < maxSize; i++) {
            int n = (int)(java.lang.Math.random()*199); 
            arr[i] = n;
        }

        System.out.println("There is an array of 100 elements in the range" +
                            " of 0 - 200. Select a location to view" +
                            " the value.");

        Scanner in = new Scanner(System.in);
        int userChoice = in.nextInt(); // get user's choice of i

        int loc = randomizedSelect(arr, 0, arr.length-1, userChoice);

        System.out.println(loc);

        System.out.println("The array was:\n" + Arrays.toString(arr));
    }

    public static int randomizedSelect(int[] array, int p, int r, int i) {
        if (p == r)
            return array[p];

        if (i == 0)
            return -1;

            int mid = randomizedPartition(array, p, r);
            int k = mid - p + 1;

            if (k == i) 
                return array[mid];
            else if (i < k)
                return randomizedSelect(array, p, mid-1, i);
            else
                return randomizedSelect(array, mid+1, r, i-k);

    }

    public static int randomizedPartition(int[] array, int start, int end) {
        Random rand = new Random();
        int pivotIdx = rand.nextInt((end - start) + 1) + start;
        int pivot = array[pivotIdx];

        swap(array[pivotIdx], array[end]);
        pivotIdx = end;

        int i = start - 1;

        for (int j = start; j <= end-1; j++) {
            if (array[j] <= pivot) {
                i++;
                swap(array[i], array[j]);
            }
        }
        swap(array[i+1], array[pivotIdx]);
        return i+1;
    }

    public static void swap(int i, int j) {
        int temp = i;
        i = j;
        j = temp;
    }       
}

如果用户选择位置选项4,则此程序的输出为: 50 阵列是:[195,24,111,50,37,128,196,117,167,195]

排序的数组应该是: [24,37,50,111,117,128,167,195,195,196]
这应该使位置选择4等于111,而不是50。

1 个答案:

答案 0 :(得分:2)

尝试放置已排序的数组,或者至少在每个randomizedPartition调用结束时数组的外观。你会发现数组在创建时没有变化。

现在尝试在每次调用swap后查看数组,同样您会注意到swap方法未更改数组。所以现在我们知道swap方法不能像你想要的那样工作。

为什么会这样?

您是否阅读了有关传递引用和传递值的信息?

对于原语,java使用passe-by-value而不是引用,因此i&amp; j方法的swap参数是存储在数组中的值的副本,更改ij的值根本不会影响数组。

尝试将swap的签名更改为

private static void swap(int[] array, int indexI, int indexJ) {...}

更改swap方法的主体以移动数组中的元素,并查看其结果。

顺便说一句,使用更好的变量名称,您的代码会更好。用于初始化数组的随机数生成器的范围也是错误的。