2017-04-21 51 views
1
void selectionSort (vector<string>& dictionary) 
{ 
    string min; 

    for (int i = 0; i < dictionary.size(); ++i) 
    { 
     for (int j = i + 1; j < dictionary.size(); ++j) 
     { 
      if (dictionary.at(j) < dictionary.at(i)) 
      { 
       min = dictionary.at(j); 
      } 
     } 

     swap(dictionary.at(i), min); 
    } 

    return; 
} 

我进入5个输入:哎,好吧,那么,没有,没关系我的选择排序函数C++有什么问题?

输出:没有,没关系,所以,没有

有人能解释我哪里错了我的排序功能?谢谢!

+4

问问自己,如果内环会发生什么* *不**找到一个小于外循环中的元素。 –

+1

嗨,欢迎来到StackOverflow。你的问题是非常清楚的陈述,但你的代码片段不会作为一个独立的程序。有人想要运行你的代码,必须建立一个main声明一个合适的'vector ',调用'selectionSort'并输出结果。这些都不是很难做到,但这需要花费时间和精力。在StackOverflow中,如果你的文章包含了所谓的[mcve],你通常会提高获得有用答案的机会。 MCVE可让您的读者快速(轻松)对您的问题进行实验 –

回答

1

试试这个:

void selectionSort(vector<string>& dictionary) 
{ 
    for (int i = 0; i < dictionary.size(); ++i) 
    { 
     int m = i; 
     for (int j = i + 1; j < dictionary.size(); ++j) 
     { 
      if (dictionary[j] < dictionary[m]) 
       m = j; 
     } 
     if (m != i) 
      swap(dictionary[i], dictionary[m]); 
    } 
} 

基本上当你i-loop开始你认为m个元素是最小的,然后里面j-loop您检查剩余的元素,如果有一个更小的元素。如果你发现更小的元素,你更新m(而不是复制实际的字符串)。在循环结束时,您检查m是否从i更改,如果是这样,您交换im的元素。

Here's full example with your input,问问题时,它的建议,以提供类似的小例子,可以很容易地重现您的问题:

#include <vector> 
#include <string> 
#include <iostream> 
#include <algorithm> 
#include <assert.h> 

using namespace std; 


void selectionSort(vector<string>& dictionary) 
{ 
    for (int i = 0; i < dictionary.size(); ++i) 
    { 
     int m = i; 
     for (int j = i + 1; j < dictionary.size(); ++j) 
     { 
      if (dictionary[j] < dictionary[m]) 
       m = j; 
     } 
     if (m != i) 
      swap(dictionary[i], dictionary[m]); 
    } 
} 

int main() 
{ 
    vector<string> data{ "hey", "ok", "so", "no", "okay" }; 
    vector<string> data2 = data; 
    selectionSort(data); 
    std::sort(data2.begin(), data2.end()); 
    assert(equal(data.begin(), data.end(), data2.begin())); // verify that your sort matches what std::sort does 
    for (const auto s : data) 
     cout << s << ' '; 
    cout << endl; 
} 

,输出是:

hey no ok okay so