0

我想用 Ruby 编写一个冒泡排序程序。请不要在没有首先指出我的代码中的错误的情况下建议一种新的方法。我可以查找 Ruby 冒泡排序方法的答案,但我不知道为什么我的代码不起作用。

我正在使用while循环,但是,我的方法似乎不会连续循环,直到它完全通过一次而不进行交换。我没有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

i问题是0当您在while swapped do.

这样做,第二个循环不会超过一次。

这会起作用:

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

正如史蒂文建议的那样。问题在于您的 i=0。它应该被移到第一个 while 循环中,以便它可以重置。

为了避免与第二个 while 循环的所有混淆。

(array.length-1).times 做 |i|
代码.....结束

以上效果很好。每次重置 i。

于 2013-10-18T06:00:49.587 回答
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

我不是 rubby 程序员,但我尝试了与此代码等效的 C#,它运行良好。

于 2013-01-24T14:06:45.007 回答