【问题标题】:Strange Output in Selection Sort using C++ min_element()?使用C ++ min_element()进行选择排序的奇怪输出?
【发布时间】:2021-03-08 13:58:09
【问题描述】:

在理解了逻辑之后,我自己为选择排序实现了这段代码。您可以清楚地看到我使用 C++ STL 的min_element() 来查找数组中的最小元素。但是输出完全错误。似乎forward iterator firstmin_element() 没有迭代。有人可以帮我找到潜在的问题。提前致谢!

#include<iostream>
#include<algorithm>


using namespace std;

void Swap(int &a,int &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

【问题讨论】:

  • 想想Swap(arr[i],Min); 做了什么。那是交换数组元素吗?
  • 另外,您有时会将相同的元素传递给Swap,这是错误的。此外,您根本没有实现 selection_sort。
  • 您是否尝试过将arr 初始化为{11, 22, 12, 25, 64}?这种情况下的结果是错误的,但并非完全错误,它表明您实际上将第一个参数更新为min_element。 (不,这不是答案,只是对您的“似乎”假设的测试。)
  • 您知道您的“聪明”交换很可能比带有第三个变量的明显交换慢得多吗?

标签: c++ algorithm c++11 stl selection-sort


【解决方案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);
}

您现在会发现您的交换也无法正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多