Java: комбинированные функции сортировки вычисляют неверные результаты - PullRequest
2 голосов
/ 04 апреля 2019

У меня есть программа, которая генерирует строки 6 чисел (INT массивы). Я передаю вывод в другую программу, которая сортирует его с алгоритмом BubbleSort и записывает его в текстовый файл. Если первая программа используется без прохождения он работает отлично, не повторяющиеся цифры без нулей. но при сортировке там повторяются цифры и даже я видел нули, случай нулей я не мог воспроизвести атм, но числа двойных происходит. Может ли что-то делать с многопоточной / параллельной обработки или среды, в whicht он выполняется и который состоит из ВМД MultiCore выиграть 10 хозяина и DEB Jessie гостя.

java LottoArray | java BubbleSort>test2.txt 1004 * // терминал

test2.txt 1010 *

2 13 16 20 27 40 
9 14 17 21 25 41 
6 11 11 19 27 44 
4 10 25 34 39 47 
11 12 17 36 44 48 
1 15 23 31 39 40 
3 22 22 23 33 45 
1 25 26 26 35 49 
11 14 24 25 41 49 
6 6 14 17 38 46 
4 19 19 28 35 39

Как вы можете видеть sixs в строке до последней строки являются двойными и 22s и 11s.

public class LottoArray{

    public static void main (String [] args){

    for(int o=0;o<=10;o++){
        int Reihe [] = new int [6];
        int zahl;

        int j=0;
        int i= 0;

        while(j<Reihe.length){
            zahl = (int) (Math.random()*50);
             boolean schonda = false;
            while ( i<j){
                if(Reihe[i]== zahl) 
                    schonda=true;
                i++;
            }

            if(schonda==false && zahl !=0){
                Reihe[j]=zahl;
                j++;}
        }

       for(int z=0;z<6;z++){
            System.out.print(Reihe[z]+" ");
    }   
    System.out.println();

    }  

   }
}
public class BubbleSort {

    public static void main(String args[]) {
    int arr[]= new int[6];
    while(!StdIn.isEmpty()){

           for(int i=0;i<6;i++)

         arr[i]= StdIn.readInt();
        boolean getauscht;

        do {
            getauscht= false;       


            for (int i=0; i<arr.length-1; i++) {

                if ( arr[i] > arr[i+1]) {
                    int tmp = arr[i];   
                    arr[i] = arr[i+1];
                    arr[i+1] = tmp;
                    getauscht = true;
                }
            }

        }while(getauscht); 


        for (int i=0; i<arr.length; i++)
            System.out.print(arr[i]+" " );
        System.out.println();
        }
    }
}

если я использовать код без BubbleSort и поток вывода в текстовый файл, нет никакого повторного числа и нет нулей, как это должно быть не представляется возможным, так как я закодирован условием if(schonda==false && zahl !=0)

15 2 20 5 26 34 
13 6 15 33 12 37 
44 17 16 23 40 25 
25 47 10 43 40 44 
25 29 3 30 10 41 
32 1 23 35 43 28 
9 34 28 32 33 25 
5 46 31 16 25 9 
9 13 16 18 40 5 
29 15 16 2 16 15 
34 33 44 13 43 48

есть кто-то испытывает с такого рода происходят номера, которые не должны?

1 Ответ

0 голосов
/ 04 апреля 2019

Ваша проблема в этом блоке LottoArray:

int j=0;
int i= 0;

while(j<Reihe.length){
    zahl = (int) (Math.random()*50);
    boolean schonda = false;
    while ( i<j){
        if(Reihe[i]== zahl) 
            schonda=true;
        i++;
    }

    if(schonda==false && zahl !=0){
        Reihe[j]=zahl;
        j++;
    }
}
  • При первом входе в цикл while (i<j){ сверху (для первого элемента) и i, и j равны 0, поэтому цикл не выполняется.
  • Во второй раз (проверка второго числа) i равен 0, а j равен 1, поэтому цикл выполняется и i увеличивается.
  • В третий раз (проверяя третье число) i равно 1, а j равно 2.
  • То же самое для остальных, i всегда равно j-1.

Это ошибка, так как вы не запускаете проверку первого элемента.Я полагаю, что вы получаете дубликаты только с помощью BubbleSort, так как ошибки нет.

Чтобы исправить это, инициализируйте i внутри первого while, там же, где и schonda var, не выше с j.

...