2015-03-14 3 views
2

Вот моя домашняя работа: я хочу знать, сколько сравнений и обменов происходит в сортировке. Когда я объявил мой массив в обратном порядке или в порядке убывания следующим образом:Сортировка сортировки не отсортировалась по убыванию

int arr[] = { 5, 4, 3, 2, 1 }; 

& hellip; он работает нормально и счетчик сравнивает и обмен тоже, но когда я пытаюсь дать «п» и заполненный массив в обратном порядке, она заполнена он в порядке убывания, но он не работал должным образом, чтобы сортировать по убыванию, чтобы считать мои обмены, хотя он подсчитывает.

Вот код:

public class SelectionSort { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     // TODO code application logic here 

     Scanner in = new Scanner(System.in); 
     int compares = 0, exchanges = 0, x; 
     x = in.nextInt(); 
     int[] arr = new int [x]; 
     int n = arr.length; 
     int s = 0; 
     int min; 
     int temp, i, j; 
     System.out.print("Filling Array"); 
     for(i = n - 1; i > 0; i--) 
     { 
      arr[i] = i; 
      System.out.print(" " + arr[i]); 
     } 
     System.out.println(""); 
     for(i = 0; i < n ; i++) 
     { 
      min = i ; 

      for(j = i + 1; j < n; j++) 
      { 
       compares++; 
       if(arr[min] > arr[j]) 
        min = j; 
      } 

      if(min != i) 
      { 
       exchanges++; 
       temp = arr[i]; 
       arr[i] = arr[min]; 
       arr[min] = temp; 
      } 

      System.out.println("Iteration " + (++s)); 
      for(int a = 0; a < arr.length; a++) 
       System.out.print(" " + arr[a]); 

      System.out.println(""); 
     } 
     System.out.println(""); 
     System.out.println("Compares -- >> " + compares); 
     System.out.println("Exchanges -->> " + exchanges); 
    } 
} 
+1

Можете ли вы дать некоторые образцы того, что сравнивает и обмены, как ожидается, против того, что ваша программа дает для данного массива? – KevinL

+1

Если я запустить свой код и вход 4 печатает: 'Заполнение массива 3 2 1' ' 1' Итерация '0 1 2 3' ' Итерация 2' '0 1 2 3' ' Итерация 3' '0 1 2 3' ' Iteration 4' '0 1 2 3' ' Compares - >> 6' 'Биржи - >> 0' Не уверен, что вы ожидаете от этого. – WonderWorld

+0

Предположим, что у меня есть массив {2,1,3,4}. Теперь функции проверяют каждый элемент, если его больше, а затем затем обмениваются так, чтобы обменять ++, в этом массиве происходит только один обмен, а 6 - для поиска малых и больших –

ответ

0

Существует очень простая причина для этого, чтобы показать неправильный подсчет EXCHANGES, которые имеют место. Если вы следуете по этому коду:

System.out.print("Filling Array"); 
for(i = n - 1; i > 0; i--) 
{ 
    arr[i] = i; 
    System.out.print(" " + arr[i]); 
} 

Есть еще? Массив никогда не заполняется и не сортируется в порядке убывания, вы печатаете его только в обратном порядке.

Давайте предположим, что n = 3 и когда массив инициализируется это { 0, 0, ... } и следовать за цикл:

Итерация 1:

// i = n - 1 = 2 
// i > 0 = true 
// arr[i] = i; 
// arr[2] = 2; 
// print statement 

Итерация 2:

// i - 1 = 1 
// i > 0 = true 
// arr[i] = i; 
// arr[1] = 1; 
// print statement 

итерацию 3:

// i - 1 = 0 
// i > 0 = false 
// arr = { 0, 1, 2 } 

Попробуйте для заполнения обратного отсортированного массива:

for (i = n - 1, z = 0; i > 0; i--, z++) 
{ 
    arr[z] = i; 
} 
+0

Спасибо, человек, который вы очистили мои взгляды на обратное –