使用冒泡排序C ++时遇到问题

时间:2015-09-02 07:50:33

标签: c++ sorting

我的冒泡排序代码出了问题。我正在尝试对包含数字的字符串向量进行排序。它似乎工作,然后通过比较数字,它开始比较一切错误(例如:它认为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然后错误地比较它们并抛弃一切。

3 个答案:

答案 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的其他内容。