2015-07-01 4 views
0

Я пытаюсь ввести длину массива и затем ввести элементы массива. Я смог проверить наибольшее значение в случае 1, но я делаю случай 2, чтобы повторно сортировать массив от наименьшего числа до самого большого, но я не смог этого сделать.Не удалось сортировать массив int с использованием метода свопинга в Java

Вот мой код:

package peopleinfo; 

import java.util.Scanner; 

public class mainapp 
{ 
    public static void main(String[] args) 
    { 
    Scanner sc1 = new Scanner(System.in); 
    System.out.println("please input the length of the array:"); 
    arraybuilder(sc1.nextInt()); 
    } 

    public static void arraybuilder(int i) 
    { 
    Scanner sc = new Scanner(System.in); 
    int[] array = new int[i]; 
    for (int j = 0; j < array.length; j++) 
    { 
     int o = j; 
     System.out.println("please input the" + ++o + " number"); 
     array[j] = sc.nextInt(); 
    } 
    for (int j2 = 0; j2 < array.length; j2++) 
     System.out.print(array[j2] + "\t"); 
    System.out.println("what do you want to do ?\n 1 check the biggest number\n2 sort the array from the smallest\nterminate the app"); 
    int dwc = sc.nextInt(); 
    switch (dwc) 
    { 
     case 1: 
     int k = 0; 
     int max = 0; 
     for (int j = 0; j < array.length; j++) 
     { 
      if (array[j] > k) 
      { 
      max = j; 
      k = array[j]; 
      } 
     } 
     System.out.println("the largest number is " + array[max]); 
     break; 

     case 2: 
     int temp; 
     boolean fixed = false; 
     while (fixed = false) 
     { 
      fixed = true; 
      for (int u = 0; u < array.length - 1; u++) 
      { 
      if (array[u] > array[u + 1]) 
      { 
       temp = array[u + 1]; 
       array[u + 1] = array[u]; 
       array[u] = temp; 
       fixed = false; 
      } 
      } 
     } 
     for (int j = 0; j < array.length; j++) 
     { 
      System.out.print(array[j] + "\t"); 
     } 
     break; 
     default: 
     System.out.println("Error, please rerun the code:)"); 
     break; 
    } 
    } 
} 

Я не понимаю, что я делаю неправильно?

+3

** P.N: ** должно быть 'while (! Fixed) {' а не 'while (fixed = false) {'. –

+0

Выполнение изменений в приведенном выше комментарии не устранит проблему, поскольку используемый алгоритм сортировки неверен. Цикл 'while' не имеет никакой цели и должен быть удален. –

ответ

0

while (fixed = false) fixed = false - это присвоение, и оно будет отображаться как «ложное», потому что fixed назначается как false, что делает цикл while никогда не запускаемым.

1
case 2: 
       int temp; 
       boolean fixed = false; 
       while (fixed == false) { // See the change here 
        fixed = true; 
        for (int u = 0; u < array.length - 1; u++) { 
         if (array[u] > array[u + 1]) { 
          temp = array[u + 1]; 
          array[u + 1] = array[u]; 
          array[u] = temp; 
          fixed = false; 
         } 
        } 
       } 
       for (int j = 0; j < array.length; j++) { 
        System.out.print(array[j] + "\t"); 
       } 

       break; 

В вашем случае 2 петля while() имеет fixed = false

ли должен быть fixed == false т.е. while(fixed==false).

Для получения дополнительной информации перейдите по ссылке ... Using the assignment operator instead of the equality operator

0

Вы присваиваете значение ложного для фиксированного вместо comparing.Change код, как показано ниже, и проверить, он должен работать.

case 2: 
      int temp; 
      boolean fixed = false; 
      while (fixed == false) { //check this line 
       fixed = true; 
       for (int u = 0; u < array.length - 1; u++) { 
        if (array[u] > array[u + 1]) { 
         temp = array[u + 1]; 
         array[u + 1] = array[u]; 
         array[u] = temp; 
         fixed = false; 
        } 
       } 
      } 
      for (int j = 0; j < array.length; j++) { 
       System.out.print(array[j] + "\t"); 
      } 

      break; 
0

Вы проверили для boolean в while (fixed = false). Обратите внимание, что вы назначаете там значение и для проверки boolean вам необходимо использовать ==, например while (fixed == false) или while (!fixed).

Потому что, когда вы используете while (fixed = false) он не возвращает значение boolean, вместо этого fixed назначается в качестве false. Вы можете видеть, что условие всегда будет ложным, и цикл не будет выполняться.

+0

Даже при этом изменении код сортировки не даст желаемого результата. –

+0

@TimBiegeleisen Исправление алгоритма как 'while (fixed == false)' работает и дает желаемый результат при сортировке массива в порядке возрастания. Я тоже его протестировал. Пожалуйста, дайте мне знать, если у вас есть сценарий, для которого он не работает. –

+0

Итак, вы в основном говорите, что массив размером 'N' всегда может быть отсортирован в' O (N) 'time? Это не значит, что мы знаем об алгоритмах сортировки. –

0

Ваш код для второго случая неверен. Кажется, вы пытаетесь сделать Bubble Sort, но вам не хватает второго цикла. Я проверил, что ваш текущий код не сортировать массив. Попробуйте этот код вместо:

case 2: 
    int temp; 
    // Bubble sort the array 
    for (int i=0; i < array.length; i++) { 
     for (int j=1; j < (array.length - i); j++) { 
      if (array[j-1] > array[j]) { 
       temp = array[j-1]; 
       array[j-1] = array[j]; 
       array[j] = temp; 
      } 
     } 
    } 

    for (int j=0; j < array.length; ++j) { 
     System.out.print(array[j] + "\t"); 
    } 
    break; 

Я также удалил логику в while петлю, потому что, похоже, не служит никакой цели.

+0

вы сделали ту же ошибку ... как он это сделал ... просто измените это ... и его код отлично работает ... – CoderNeji