0

Rubyでバブルソートプログラムを書きたいです。私のコードのバグを最初に指摘せずに、これを行うための新しい方法を提案しないでください。Rubyのバブルソート方法の答えを調べることはできますが、コードが機能しない理由がわかりません。

ループを使用していwhileますが、スワップを行わずに完全に1回通過するまで、メソッドは継続的にループしないようです。whileループを正しく使用していませんか?

これが私のスクリプトです:

def bubblesort(array)
      i = 0 
      swapped = true
      lenght = array.length-1
      while swapped do
          swapped = false
          while i <lenght
              n = i +1
              if array[i] > array[n]
              dummy = array[i]
              array[i]= array[n]
              array[n] = dummy  
              swapped = true

              end
             i+=1
          end

      end
      return array
end
4

4 に答える 4

1

問題は、内の2番目の反復に移動したときにi変数がリセットされないことです。0while swapped do

そうすることで、2番目のループに2回以上入ることはありません。

これはうまくいくでしょう:

def bubblesort(array)
      swapped = true
      lenght = array.length-1
      while swapped do
          i = 0
          swapped = false
          while i <lenght
              n = i +1
              if array[i] > array[n]
                  dummy = array[i]
                  array[i]= array[n]
                  array[n] = dummy  
                  swapped = true
              end
             i+=1
          end
      end
      return array
end
于 2013-01-24T13:51:18.387 に答える
1

これは11要素用です。サイズは任意の数に変更できます

#include <iostream>
#include <conio.h>
using namespace std;

void swap(int *,int *);
void printArr(int *,int Siz=11);
int main(){

int a[]={1,4,15,10,12,6,3,2,8,5,7};
//int a[]={1,2,3,4,5,5,7,8,10,11,9};

int len=11,i=0,j=0,temp=0;
bool swapped=false;
    while(i<len){

        swapped=false;j=0;
        while(j<len-1){
            if(a[j]>a[j+1]){
                swap(&a[j],&a[j+1]);
                swapped=true;
            }
            cout<<"loop : "<<i<<" "<<a[j]<<" "<<a[j+1]<<endl;
            j+=1;

        }
        i+=1; len-=1; //as the largest value has already moved to last location. need no further comparison
        if(!swapped) break;
    }
    printArr(a);
    system("pause");
}

void swap(int *a,int *b){
    int t=*a;
    *a=*b;
    *b=t;

}

void printArr(int *a,int Siz){
    for(int i=0; i<Siz; i++) cout<<a[i]<<" "; 
}
于 2014-02-11T18:31:12.833 に答える
0

これは機能します:

http://codepad.org/8BsoiWQo

def bubblesort(array)
      i = 0 
      swapped = true
      length = array.length
      while i < length-1 and swapped do # also check for end of array
          swapped = false
          n = i +1  # second loop variable 'n' should be initialized here
          while n < length
              if array[i] > array[n]
                  dummy = array[i]
                  array[i]= array[n]
                  array[n] = dummy  
                  swapped = true
              end
             n += 1 # 'n' should be incremented here...
          end
          i += 1 # and 'i' here
      end
      return array
end

私は粗末なプログラマーではありませんが、このコードと同等のC#を試しましたが、問題なく動作しました。

于 2013-01-24T14:06:45.007 に答える
0

スティーブンが示唆したように。問題はi=0にあります。リセットできるように、最初のwhileループに移動する必要があります。

2番目のwhileループとのすべての混乱から救うため。

(array.length-1).times do | i |
コード.....終了

上記はうまく機能します。毎回iをリセットします。

于 2013-10-18T06:00:49.587 に答える