2013-01-24 91 views
0

我想在Ruby中編寫一個冒泡排序程序。如果不先指出我的代碼中的錯誤,請不要提出新的方法。我可以查找Ruby冒泡排序方法的答案,但我無法弄清楚爲什麼我的代碼無法工作。在氣泡排序中實現while循環?

我正在使用一個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 
+0

你「而換做」,那麼爲什麼不「而I

+0

我會將'lenght'變量重命名爲'length';) – Huluk

+0

嗨Ali。如果其中一個答案幫助您解決了問題,那麼您應該將其標記爲已接受的答案並/或將其取消。請參閱[常見問題]瞭解更多信息。 –

回答

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 
+0

不正確。你試過了嗎? –

+0

我嘗試了一個快速示例[這裏](http://codepad.org/DG4CNVPT)。 似乎工作正常。 – Steven

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#中的等價代碼,它工作得很好。

+0

對不起!我沒有Ruby IDE(對ruby一無所知!),所以我將你的程序轉換爲C#,糾正它,並將其轉換回Ruby。可悲的是第二次轉換有一些錯誤!我糾正了他們。還在線上的Ruby IDE中測試了代碼:[http://codepad.org/8BsoiWQo](http://codepad.org/8BsoiWQo) –

+0

您可以像這樣進行交換:'array [i],[array [n] = array [n],array [i]'。 (http://codepad.org/RdR8SgLi) – steenslag

+0

非常有幫助。謝謝。 – Ali

0

正如史蒂文建議。問題在於你的i = 0。它應該移到第一個while循環中,以便它可以重置。

爲了避免與第二while循環混淆。

(array.length-1).times do | i |
code ..... end

以上的工作很好。每次重設我。

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