2015-02-02 2 views
-1

Здравствуйте, я работал над сортировкой вставки по набору чисел. Я могу добавить их в массив для выполнения сортировки, но я не смог генерировать уникальные значения с большим набором чисел для выполнения сортировки (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; 

     } 
    } 
} 
+1

См http://stackoverflow.com/questions/4040001/creating-random-numbers-with-no-duplicates – nayakam

ответ

1

вы можете использовать Math.random(), а также добавить одно условие, которое будет проверять, массив содержит это число или нет, если не содержит, то добавьте в противном случае не добавляйте.

2

Одно простое решение с помощью 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); 
} 

, но это может занять бесконечное время, чтобы создать набор, как это в теории, но его вероятность очень низкая.

2

Если все, что вы хотите, это набор уникальных чисел для сортировки, я бы сказал, что самым простым подходом было бы создание массива размера 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

Это имеет то преимущество, что это будет r un в O (n) времени (вместо потенциально бесконечного времени, если вы выбираете случайные числа, а затем только вставляете их, если их еще нет).

Edit: Вы можете также использовать встроенный метод перетасовки в Java https://docs.oracle.com/javase/6/docs/api/java/util/Collections.html#shuffle(java.util.List)

+0

Хотя перетасовка является Хорошее решение, но OP сказал, что он хочет 1000 случайных чисел, а не случайных чисел от 0 до 1000, поэтому прежде всего вы должны изменить свой размер, также если максимальное число слишком велико, как 1 миллиард или около того, перетасовка - это не очень хороший ответ, потому что он принимает время, чтобы заполнить массив и более важно, чем это, он принимает огромное количество барана без причины! Просто сделайте математику;) – Lrrr

+0

@AliAmiri, @ tytk Спасибо, что помогли .., я сказал, что тысячи значений должны быть в пределах 1000 со случайным перетасовкой, а не тысячами случайных значений. и о методе тасования, похоже ли, что я определил новый метод и выполнил операцию? – Learningprog

+0

@ Learningprog, где вы сказали не тысячу случайных чисел ?! вы просто сказали, что хотите 1000 уникальных случайных чисел: «генерировать уникальные значения с большим набором чисел для выполнения сортировки (i: e) для 1000 значений». также 1000 уникальных случайных чисел от 0 до 1000 - все числа от 0 до 1000! в этом нет ничего случайного! – Lrrr

Смежные вопросы