簡體   English   中英

修改氣泡排序程序中的錯誤

[英]Error in program for modified bubble sort

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;
}

您的編譯器應該已經就該問題警告過您(您確實打開了所有警告,是嗎? 總是這樣做!):一旦i==strlen(s)-1 ,通過算術規則的魔術, j的循環就基本上不受限制了用於有符號/無符號值。

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

沒有這個問題。 i應該沒有unsigned 。)

或停止循環為i早。 那時,您的代碼中的問題仍然存在,但是您不會遇到它。 但我認為這是最差的方法-修復錯誤, 然后觀察i進行優化,因為最后一個字符已經形成排序序列,因此i不需要走得更遠。

更改此:

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

變成這個:

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

否則, s值將超出其端點

對於s奇數長度len ,外循環運行直到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)

這是我的代碼

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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM