2017-04-21 34 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