Сортировка выбором дает неверный результат

У меня проблема с выводом в этой сортировке выбором.

Вот код:

public class SelectionSort{
    public static void main(String args[]){

        int [] arr_sort = {1, 7, 2, 18, 23, 13};

        System.out.println("Selection Sort");
        System.out.print("Before sorting: ");
        int x;
        for(x=0; x<arr_sort.length; x++){
            System.out.print(arr_sort[x] + " ");
        }

        System.out.println("");
        System.out.print("After sorting: ");

        int n = arr_sort.length;
        int i,j, min, temp;
        for(i=0; i<n; i++){
            min=1;
        for(j=i+1; j<n; j++){
         if (arr_sort[j]<arr_sort[min]){
            min=j;
            temp=arr_sort[i];
            arr_sort[i]=arr_sort[min];
            arr_sort[min]=temp;
        }

    }

System.out.print(arr_sort[i] + " ");
 }

}

}

Выход:

Selection Sort
Before sorting: 1 7 2 18 23 13 
After sorting: 2 1 7 18 23 13 

person user2768501    schedule 18.09.2013    source источник
comment
Так в чем проблема? Должно быть, я пропустил эту часть, читая ваш вопрос.   -  person Makoto    schedule 19.09.2013
comment
Сортировка немного запуталась, как вы можете видеть в разделе «После сортировки». Должно быть: 1, 2, 7, 13, 18, 23.   -  person user2768501    schedule 19.09.2013


Ответы (1)


Проблема в том, что min объявлен вне цикла.

При запуске новой итерации оно по-прежнему будет сохранять старое значение, поэтому вы будете сравнивать с элементом, который уже признан минимальным и выбранным.

Кроме того, min не должно быть 1, вместо этого сделайте его i, так как вы не хотите сравнивать со вторым элементом на каждом шаге.

После этих изменений это работает, но на самом деле это не сортировка выбором, вам нужно найти минимум и поменять местами только тогда, а не каждый раз, когда вы найдете меньший элемент.

К коду:

int n = arr_sort.length;
int i, j, temp; // min removed here
for (i = 0; i < n; i++)
{
  int min = i; // min declared here and changed to i
  for (j = i + 1; j < n; j++)
  {
     if (arr_sort[j] < arr_sort[min])
     {
        min = j;
     }
  }
  // moved swap to here
  temp = arr_sort[i];
  arr_sort[i] = arr_sort[min];
  arr_sort[min] = temp;
  System.out.print(arr_sort[i] + " ");
}
person Bernhard Barker    schedule 18.09.2013
comment
Я пытался найти причину проблемы с этим кодом. Вы мне очень помогли, большое спасибо! - person user2768501; 19.09.2013