如何编写递归插入排序?

时间:2011-11-06 01:23:15

标签: ruby recursion

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中编写递归函数有很多困难。

2 个答案:

答案 0 :(得分: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,这就是全部。

答案 1 :(得分:-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 ++中插入排序的递归实现