Недавно я изучал алгоритмы сортировки, и, как и многие вводные книги по алгоритмам, та, которую я начал читать, начинается с реализации сортировки выбором. код выглядел следующим образом...
Реализация А
//a is an array of ints.
int n = a.length;
for(int i = 0; i < n; i ++){
int min =0;
for( int x = i+1; x <n;x++){
if(a[x].compareTo(a[i])<0){
Comparable tmp = a[i];
a[i] = a[x];
a[x] = tmp;
}
}
}
После анализа блока кода я изменил алгоритм на следующий.
Реализация Б
//a is an array of ints
int n = a.length;
for(int i = 0; i < n; i ++){
int min =i;
for( int x = i+1; x <n;x++){
if(a[x].compareTo(a[min])<0){
min=x;
}
}
if(min>i){
Comparable tmp = a[i];
a[i] = a[min];
a[min] = tmp;
}
}
Я также нашел аналогичные реализации в Интернете, используя минимальное значение для поиска наименьшего значения в массиве, а затем заменяя его элементом в позиции i массива. Мой вопрос: что-то не так со второй реализацией? это не правильная сортировка выбора, потому что она не заменяет каждый найденный элемент, который меньше, чем элемент в позиции i, а вместо этого ждет, пока он не найдет наименьший элемент в массиве перед заменой?
Я провел несколько тестов с обоими алгоритмами с более чем 10000 значений массива, и вторая реализация всегда завершается первой, почти вдвое быстрее. Эти тесты проводились на рандомизированных массивах.