修改冒泡排序程序出错

时间:2013-12-31 15:45:01

标签: c++ string sorting

Codeforces问题339A - http://codeforces.com/problemset/problem/339/A

我试图对存储在数组偶数位置的值进行排序(从0开始)。运行程序或程序时出错,返回垃圾值。我的解决方案出了什么问题?

我的解决方案:

#include<iostream>
#include<cstring>

using namespace std;

int main()
{
    char s[101],temp;
    int i,j;

    cin>>s;

    for(i=0;i<strlen(s);i+=2) //Bubble sorting values at even values of i.'+' is stored at odd values of i.
    {
        for(j=0;j<(strlen(s)-i-2);j+=2)
        {
            if(s[j]>s[j+2])
            {
                temp=s[j];
                s[j]=s[j+2];
                s[j+2]=temp;
            }
        }
    }

    cout<<s;
}

4 个答案:

答案 0 :(得分:1)

你的编译器应该警告你这个问题(你确实打开了所有警告,是吗?总是这样做!):i==strlen(s)-1后,j的循环对于有符号/无符号值的算术规则的魔力,它本质上是无限的。

for(unsigned j=0; j+2+i < strlen(s); j+=2)

没有这个问题。 (i也应为unsigned。)

或者之前停止i的循环。您的代码中的问题仍然存在,但您不会遇到它。但我认为这是更糟糕的路线 - 修复错误,然后优化,观察i不需要走得太远,因为最后一个字符已经形成一个排序序列

答案 1 :(得分:0)

改变这个:

 for(i=0;i<strlen(s);i+=2) 

进入这个:

 for(i=0;i<strlen(s) - 2;i+=2)

否则,s值的处理超出其终点

答案 2 :(得分:0)

对于len的奇数长度s,外部循环一直运行到i==len-1。然后内环终止于len - len - 1 - 2。由于strlen返回无符号类型,因此计算结果为非常大的无符号数,导致内循环读取超出s末尾的路径。最终,您将获得无法读取或写入的内存,从而导致崩溃。

您可以通过更快结束外部循环来解决此问题

int len = strlen(s);
for(i=0;i<len-2;i+=2) {
    for(j=0;j<(len-i-2);j+=2)

答案 3 :(得分:0)

这是我的代码

void bubble(int a[], int n){
    for(int i=0; i<n; i++){
        int swaps=0;
        for(int j=0; j<n-i-1; j++){
            if(a[j]>a[j+1]){
                int t=a[j];
                a[j]=a[j+1];
                a[j+1]=t;
                swaps++;
            }
        }
        if(swaps==0)
            break;
    }
}