【问题标题】:Writing a selection sort for STL list?为 STL 列表编写选择排序?
【发布时间】:2019-10-17 23:37:39
【问题描述】:

我正在编写一个特定的 c++ 程序,以根据我的教授的要求在 STL 列表上使用选择排序。

我使用的是 Netbeans 9.2。目前,我被我的算法卡住了。前几次,程序编译,但选择后的列表总是以相同的值结束(假设它应该是 99、24、15、80、27,它总是 1、1、1、1、 2 排序后)。现在该算法直接无法编译。我对编码比较陌生。有人可以告诉我我做错了什么以及我应该怎么做?非常感谢!

这是我的代码:

void selectionSort(list<short> l, int size) {
    list<short>::iterator it1;
    list<short>::iterator it2;
    list<short>::iterator it3;
    short min, temp; 
    for(it1 = l.begin(); it1 != l.end(); it1++) {
        temp = min = *it1;
        it2 = it1;
        for(it2 = it1; it2 != l.end(); it2++) {
            if(*it2 < min) {
                min = *it2;
                it3 = it2;
            }    
        }
        *it1 = min;
        *it3 = temp;
        //Increment the first counter at the end
        temp = min = *it1;
    }
}

【问题讨论】:

标签: c++ list sorting stl


【解决方案1】:

您的代码中存在会导致崩溃的错误。我已经在下面的代码中修复了它。

但我仍然不知道为什么它会输出像 1、1、1、1、2 这样的奇怪数字。 也许它是由您的其余代码引起的。 如果能提供更多代码或信息会很有帮助。

void selectionSort(list<short> l, int size) {
    list<short>::iterator it1;
    list<short>::iterator it2;
    list<short>::iterator it3;
    short min, temp;
    for(it1 = l.begin(); it1 != l.end(); it1++) {
        temp = min = *it1;
        it2 = it1;
        it3 = l.end();  // NOTE: to fix the bug
        for(it2 = it1; it2 != l.end(); it2++) {
            if(*it2 < min) {
                min = *it2;
                it3 = it2;
            }
        }
        if (it3 != l.end()) {  // NOTE: to fix the bug
            *it1 = min;
            *it3 = temp;
        }  // NOTE: to fix the bug
        //Increment the first counter at the end
        temp = min = *it1;  // NOTE: This is unnecessary
    }
}

【讨论】:

  • 为了让您的答案对更广泛的受众有用,您应该说明错误是什么。
【解决方案2】:

您通过值而不是通过引用传递参数l。这就是为什么您在函数selectionSort 中所做的操作对更改列表没有任何作用。这是一个有效的版本:

#include <iostream>
#include <list>

void selectionSort(std::list<short>& l) {
  std::list<short>::iterator it1;
  std::list<short>::iterator it2;
  std::list<short>::iterator it3;
    short min, temp;
    for(it1 = l.begin(); it1 != l.end(); it1++) {
        temp = min = *it1; 
        it3 = l.end();
        for(it2 = it1; it2 != l.end(); it2++) {
            if(*it2 < min) {
                min = *it2;
                it3 = it2;
            }
        }
        if (it3 != l.end()) {
            *it1 = min;
            *it3 = temp;
        }
    }
}

int main()
{
  std::list<short> mylist= {10,1,8,13,14,7,6,5,18,9,19,12,17,15,4,2};
  selectionSort(mylist);
  std::list<short>::iterator it;
  std::cout << "elements in list\n";
  for (it = mylist.begin(); it != mylist.end(); it++) {
      std::cout << *it << std::endl;
    }
  return 0;
}

简而言之,您需要在selectionSort 函数的声明中,在l 的类型之后添加一个&amp;

更新

我从代码中删除了size 参数,因为您没有使用它,而且实际上也不需要它。

【讨论】:

    猜你喜欢
    • 2011-08-09
    • 2013-07-06
    • 2014-03-13
    • 2014-02-15
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    相关资源
    最近更新 更多