Проблема во внутреннем цикле.
Это начинается с i + 1.Таким образом, код для сравнения max фактически сравнивает [1] с [4].
, вы можете изменить его на for (int j=i;j<a.length-i;j++)
Также, как вы можете прочитать в комментарии, может бытьслучай, когда с вышеупомянутым изменением код все еще не будет работать.Это произойдет, потому что i == max
и, следовательно, существующий подход подкачки не будет работать.Например: предположим, что array = [6,4,5], внутренний цикл max = 0, min = 1. Существующий своп сделает это [4,6,6].Следовательно, своп должен обрабатываться по-разному.
if(i==max) {
swap(a,max,a.length-1-i);
swap(a,min,i);
}else {
swap(a,min,i);
swap(a,max,(a.length-1)-i);
}
Полный код приведен ниже:
public static void dualSelectionSort(int[]a) {
for(int i=0; i<a.length-1;i++) {
int min=i;
int max=(a.length-1)-i;
for (int j=i;j<a.length-i;j++) {
if(a[j]<a[min]) {
min=j;
}
if(a[j]>a[max]) {
max=j;
}
}
if(i==max) {
swap(a,max,a.length-1-i);
swap(a,min,i);
}else {
swap(a,min,i);
swap(a,max,(a.length-1)-i);
}
}
}
public static void swap(int[] a,int i,int j) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}