Странный вывод при сортировке выборки с использованием C min_element()?

#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 также не работает.