#c #algorithm #c 11 #stl #selection-sort
#c #алгоритм #c 11 #stl #выбор-сортировка
Вопрос:
Я сам реализовал этот код для сортировки по выбору после понимания логики. Вы можете ясно видеть, что я использовал C STL min_element()
для поиска минимального элемента в массиве. Но результат совершенно неправильный. Кажется, что forward iterator first
for min_element()
не повторяется. Может ли кто-нибудь помочь мне найти основную проблему. Заранее спасибо!
#include<iostream>
#include<algorithm>
using namespace std;
void Swap(int amp;a,int amp;b){
a=a b;
b=a-b;
a=a-b;
}
void SelectionSort(int arr[],int n){
int Min;
for(int i=0;i<n-1;i ){
Min=*min_element(arr i,arr n);
Swap(arr[i],Min);
}
for(int i=0;i<n;i ){
cout<<arr[i]<<" ";
}
}
int main(){
int arr[]={64, 25, 12, 22, 11};
int n=sizeof(arr)/sizeof(arr[0]);
SelectionSort(arr,n);
return 0;
}
ВЫХОДНОЙ СИГНАЛ :
11 11 11 11 11
Комментарии:
1. Подумайте о том, что
Swap(arr[i],Min);
делает. Это замена элементов массива?2. Кроме того, вы иногда передаете одни и те же элементы
Swap
, что, как написано, неверно. Кроме того, вы вообще не реализуете selection_sort .3. Вы пробовали инициализировать
arr
{11, 22, 12, 25, 64}
? Результат в этом случае неверный, но не совсем неверный, и он демонстрирует, что вы фактически обновляете первый аргумент доmin_element
. (Нет, это не ответ, а просто проверка вашей гипотезы «кажется, как будто».)4. Вы знаете, что ваш «умный» обмен, скорее всего, намного, намного медленнее, чем очевидный с третьей переменной?
Ответ №1:
Ваша конкретная проблема с min_element
for(int i=0;i<n-1;i ){
Min=*min_element(arr i,arr n); <-- here
Swap(arr[i],Min);
}
он принимает значение итерированного элемента вместо ссылки / итератора на него, попробуйте вместо этого сделать
for(int i=0;i<n-1;i ){
auto Min=min_element(arr i,arr n); // iterator
Swap(arr[i],*Min);
}
Теперь вы обнаружите, что ваш Swap также не работает.