2011-11-06 14 views
0
def recursive_insert(arr) 
    return arr if arr.size<=1 
    recursive_insert(arr[0,arr.size-1]) 
    i=arr.size-1 
    while arr[i-1]>arr[i] and i>0 
    arr[i],arr[i-1] = arr[i-1],arr[i] 
    i-=1 
    end 
    arr 
end 
arr=[5,4,3,2,6,1] 
x=recursive_insert(arr) 
puts x.inspect 

これは機能しません。私は、Rubyが参照機構によるパスを持っていると考えています。私のarr変数が各再帰呼び出しごとに更新されるのを防ぎます。再帰的な挿入並べ替えを作成するにはどうすればよいですか?

どうすれば解決できますか?私は非常に多くの困難をRubyで再帰関数を書いている。

+0

Rubyはないポインタ、参照によって従ってないパスを持っていません。配列ソートアルゴリズムはすでに実装されています。これを使用することができます。ソートアルゴリズムを実装しようとしているのであれば、C/C++でそれをしないといけません。 –

+0

@KassymDorsel確かに、PythonやRubyのようなスクリプト言語は、より高いレベルのデータ構造とアルゴリズムを実装するのには適していますが、低レベルのものは実装しない方が良いと思います。私は詳細な実装のためにCを使用することを好みます。私はちょうどカップルのデータ構造と問題を解決することで、ルビーの理解をテストしたいと思っています。お返事ありがとう – zsljulius

答えて

2

これ:

arr[0, arr.size - 1] 

arrの一部のコピーを返し、そのコピーに変更がarrには反映されません。だから、あなたの再帰的ステップは便利な何もしないし、あなたの方法は、これに相当します。

def recursive_insert(arr) 
    return arr if arr.size<=1 
    i=arr.size-1 
    while arr[i-1]>arr[i] and i>0 
    arr[i],arr[i-1] = arr[i-1],arr[i] 
    i-=1 
    end 
    arr 
end 

、それが正しい場所に1を取得し、それがすべてです。

+0

ありがとうございます。ええ、これも私が疑った理由です。あなたはとにかく回避することを知っていますか? – zsljulius

+1

@zsljulius:最初のインデックスと最後のインデックスを配列とともに渡します。または、配列をラップするクラスを作成し、配列セグメントの「不安定さ」を維持します。 –

-1
void insertInOrder(int * a , int start ,int element) 
{ 
    if(start < 0) 
    { 
     a[start + 1] = element; 
     return; 
    } 
    else 
    { 
     if(element < a[start]) 
     { 
      a[start+ 1] = a[start]; 
      insertInOrder(a,start-1,element); 
     } 
     else 
      a[start + 1] = element; 
    } 
} 
void recursiveInsertionSort(int * a , int start , int end) 
{ 
    if(start >= end) 
     return; 
    else 
    { 
     insertInOrder(a,start,a[start+1]); 
     recursiveInsertionSort(a,start+1,end); 
    } 
} 
void main() 
{ 
    const int SIZE = 5; 
    int a[SIZE] = {9,8,7,6,10}; 
    recursiveInsertionSort(a,0,SIZE-1); 
    for(int i = 0 ; i < SIZE ; i++) 
    { 
     cout<<a[i]<<" "; 
    } 
} 

これはCで挿入ソートの再帰的実装である++

関連する問題