在线性时间内旋转数组的算法

alg*_*eks 24 arrays algorithm

如何i使用swap函数仅在线性时间内按时间旋转整数数组.

San*_*uja 47

您可以使用reverse()帮助程序在线性时间内完成此操作.

// rotate array of size=size, by n positions
void rotate(int array[], int size, int n)
{
  // reverse array[0...size-1]
  reverse(array, 0, size-1);

  // reverse A[0...n-1]
  reverse(array, 0, n-1);

  // reverse A[n...size-1]
  reverse(array, n, size-1);
}

// reverse elements in the array[pos_from ... pos_to]
void reverse(int array[], int pos_from, int pos_to)
{
   ...
}
Run Code Online (Sandbox Code Playgroud)

reverse(int array[], int pos_from, int pos_to)使用交换实现留给读者练习.提示:这可以在线性时间内完成.

  • 该链接不起作用.你能提供这种方法证明的链接吗? (5认同)
  • 我只是好奇为什么它一直在工作 (3认同)
  • @daydreamer你可以参考这个文档:http://www.cs.bell-labs.com/cm/cs/pearls/s02b.pdf如果你在Sanjit的代码中交换第二和第三个反转,它更容易理解. (3认同)

cod*_*ict 19

假设我们有一个函数调用arr_reverse(arr,i,j),它arr在索引ij使用swap函数之间反转数组的元素.

例:

arr = {1,2,3,4,5} 
i = 0
j = 2
Run Code Online (Sandbox Code Playgroud)

那么函数将返回:

{3,2,1,4,5} 
 ^^^^^
Run Code Online (Sandbox Code Playgroud)

实现这个功能是直截了当的O(N).

现在让我们使用这个函数来旋转数组.

arr     = {1,2,3,4,5} // input array
k       = 2 // amount of right rotation
result  = {4,5,1,2,3} // expected result 
l       = 5 // length of array.

Step 1: Call arr_reverse(arr,l-k,l-1) which is arr_reverse(arr,3,4)
we get {1,2,3,5,4} 
              ^^^

Step 2: Call arr_reverse(arr,0,l-k-1) which is arr_reverse(arr,0,2)
we get {3,2,1,5,4}
        ^^^^^     

Step 3: Call arr_reverse(arr,0,l-1) which is arr_reverse(arr,0,4)
we get {4,5,1,2,3} 
        ^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

整个过程使用arr_reverse3次,制作它O(N)