我的冒泡排序代码出了问题。我正在尝试对包含数字的字符串向量进行排序。它似乎工作,然后通过比较数字,它开始比较一切错误(例如:它认为4> 35)。
我在运行.o文件时从文本文件中读取数字
这是.txt文件
6
89
-9
4
718
-60
35
92
1
这就是我所拥有的:
using namespace std;
void bubbleSort(vector<string>&); //declare sort function
int main()
{
vector<string> v; //Initialize vector
string s; //Initialize string
while (cin >> s)
v.push_back(s);
bubbleSort(v); //call sort function
}
void bubbleSort(vector<string>& v){
for(int i = 0; i <= v.size(); i++) //start first loop through vector
for(int j = i+1; j < v.size(); j++){ //start second loop through vector
if(v[i] > v[j]){ //compare i-th element to i-th+1 (j-th) element
swap(v[i],v[j]); //swap elements if i-th element is greater than j-th element
for (int k = 0; k != v.size(); ++k) //loop through vector and print out binomials one per line
cout << v[k] << endl;
}
这就是它的输出:
-60
-9
1
35
4
6
718
89
92
如果有人能告诉我哪里出错了,我将不胜感激!我不明白为什么它一直有效,直到它试图比较4到35然后错误地比较它们并抛弃一切。
答案 0 :(得分:2)
在字符串中,&#34; 4&#34;实际上大于&#34; 35&#34;。如果您想要作为数字进行比较,则应转换为string to int
。然后你找到你想要的答案。
只需在bubblesort函数
中更改条件语句if( atoi(v[i].c_str()) > atoi(v[j].c_str()) )
即可
所以,最终的代码是:
void bubbleSort(vector<string>& v)
{
for(int i = 0; i < v.size(); i++) //start first loop through vector
for(int j = i+1; j < v.size(); j++) //start second loop through vector
{
if( atoi(v[i].c_str()) > atoi(v[j].c_str()) )
{
swap(v[i],v[j]); //swap elements if i-th element is greater than j-th element
}
}
for (int k = 0; k != v.size(); ++k) //loop through vector and print out binomials one per line
cout << v[k] << endl;
}
输出:
-60
-9
1
4
6
35
89
92
718
答案 1 :(得分:0)
你应该注意到虽然33是一个更大的int然后是4,如果你比较字符串则不是这样。 StrING比较检查第一个char与第一个char,如果存在相等,则继续检查下一个char。因此,如果将4与33进行比较,则得到33较小,因为3小于4。
解决方案:使用atoi将字符串更改为int,然后检查谁更大
答案 2 :(得分:0)
基本上出错的是字符串默认情况下会进行字典比较。最简单的修复方法就是将字符串向量更改为int-vector-int并使用int-converted-from-string填充该向量(假设转换成功)。如何将字符串转换为int是搜索Web或SO的其他内容。