試試這個:
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
更改,如果是這樣,您交換i
和m
的元素。
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
問問自己,如果內環會發生什麼* *不**找到一個小於外循環中的元素。 –
嗨,歡迎來到StackOverflow。你的問題是非常清楚的陳述,但你的代碼片段不會作爲一個獨立的程序。有人想要運行你的代碼,必須建立一個main聲明一個合適的'vector',調用'selectionSort'並輸出結果。這些都不是很難做到,但這需要花費時間和精力。在StackOverflow中,如果你的文章包含了所謂的[mcve],你通常會提高獲得有用答案的機會。 MCVE可讓您的讀者快速(輕鬆)對您的問題進行實驗 –