生成随机数,没有重复的插入排序值

时间:2015-02-02 05:20:43

标签: java algorithm sorting insertion-sort

您好我一直在处理数字集上的插入排序。我能够将它们添加到数组中以执行排序但我无法生成具有大量数字的唯一值来执行排序(i:e)1000个值。是否有可能我可以生成唯一的随机数在不向数组添加值的情况下执行排序?

public class InsertionBinary
{

    public static void main(String Args [])
    {
        int[] nums = {1, 2, 3, 4, 5, 6, 7, 8, 24};
        print(nums);
        insertionsort(nums);
        print(nums);
        int loc = binarySearch(nums, 3);
        System.out.println("2 is in position" + loc);
    }

    private static void swap(int[] list, int from, int to)
    {
        int temp = list[from];
        list[from] = list[to];
        list[to] = temp;
    }

    private static void print(int[] list)
    {
        for (int i = 0; i < list.length - 1; i++)
            System.out.
        print(list[i] + ", ");
        System.out.println(list[list.length - 1]);
    }


    private static void insertionsort(int[] list)
    {
        int key;
        int spot;
        for (int pass = 1; pass < list.length; pass++)
        {
            key = list[pass];
            for (spot = pass - 1; spot >= 0 && list[spot] > key; spot--)
                list[spot + 1] = list[spot];
            list[spot + 1] = key;

        }
    }
}

3 个答案:

答案 0 :(得分:3)

如果你想要的只是一组用于排序的唯一数字,我想说最简单的方法是生成一个大小为N的数组,其中包含数字0到N-1(或者如果您愿意,则为1到N),使用循环:

int size = 1000;
int[] nums = new int[size];
for(int i = 0; i < size; i++) {
    nums[i] = i;
}

然后您需要做的就是随机播放它,您可以使用已经实现的swap()方法和这个有用的答案来实现:

Random shuffling of an array

这样做的好处是它可以在O(n)时间运行(如果您选择随机数,然后只有在它们尚未存在的情况下才插入它们,而不是潜在的无限时间。)

编辑:你也可以使用Java的内置shuffle方法https://docs.oracle.com/javase/6/docs/api/java/util/Collections.html#shuffle(java.util.List)

答案 1 :(得分:1)

你可以使用 Math.random()并添加一个将检查的条件,数组是否包含该数字,如果不包含则添加,否则不添加。

答案 2 :(得分:1)

一个简单的解决方案是使用Set生成随机数并将其插入Set,设置不允许重复的数字,如下所示:

Random rnd= new Random();
Set<Integer> randomSet = new LinkedHashSet<Integer>();
while (randomSet.size() < 1000)
{
    Integer randomNum = rnd.nextInt(max) + 1;
    randomSet.add(randomNum);
}

但在理论上生成这样的集可能需要无限的时间,但其概率非常低。