当前位置: 首页 > 编程笔记 >

C ++中用于数组旋转的块交换算法

轩辕越泽
2023-03-14
本文向大家介绍C ++中用于数组旋转的块交换算法,包括了C ++中用于数组旋转的块交换算法的使用技巧和注意事项,需要的朋友参考一下

数组旋转的块交换算法是用于数组旋转的高效算法。它可以以O(n)的时间复杂度完成您的工作。

因此,在数组旋转中,我们得到了大小为n的数组arr []和定义为no的数字k。旋转元素的数量。

让我们看一个数组旋转的例子-

输入 -

arr[] = {4, 6, 1, 8, 9, 2}, k = 2 (number of rotations.)

输出-

{1, 8, 9, 2, 4, 6}

解释-旋转时,我们将一个元素移到最后一个位置,然后将下一个元素移到一个位置。

索引为0的元素将移至索引n-1。其余元素将移至上一个索引。

块交换算法

块交换算法用于完美执行数组旋转。

算法

步骤1-将数组除以k为分割点的两个子数组。令它们为X = arr [0 ... k-1]和Y = arr [k ... n-1]。

步骤2-遵循以下步骤,直到X和Y的大小相同。

步骤2.1-如果X> Y的大小,将X分为X1和X2两部分,以使X1的大小等于Y的大小。然后交换子数组X1和Y。这将改变原始数组的形式X1X2Y至YX2X1。

步骤2.2-如果Y> X的大小,则将Y分为两个部分Y1和Y2,以使Y2的大小等于X的大小。然后交换子数组X和Y2。这会将原来的数组形式从XY1Y2更改为Y2Y1X。

步骤3-当X和Y的大小相同时,交换它们。

该算法需要重复调用相同的代码块。可以使用两种方法来实现此重复呼叫。它们是递归方法迭代方法。我们将使用程序讨论该方法。

示例

程序来说明递归方法-

#include <iostream>
using namespace std;
void swapSubArray(int arr[], int start, int end, intk){
   int temp;
   for(int i = 0; i < k; i++){
      temp = arr[start + i];
      arr[start + i] = arr[end + i];
      arr[end + i] = temp;
   }
}
void blockSwapAlgo(int arr[], int k, int n) {
   if(k == 0 || k == n)
      return;
   if(k<(n-k)) {
      swapSubArray(arr, 0, (n-k), k);
      blockSwapAlgo(arr, k, (n-k));
   }
   else if(k>(n-k)){
      swapSubArray(arr, 0, k, (n-k));
      blockSwapAlgo((arr+n-k), (2*k-n), k);
   }
   else{
      swapSubArray(arr, 0, (n-k), k);
      return;
   }
}
int main() {
   int arr[] = {4, 6, 1, 8, 9, 2};
   int size = sizeof(arr) / sizeof(arr[0]);
   int k = 3;
   cout<<"Array before rotations :\t";
   for(int i = 0; i<size; i++)
      cout<<arr[i]<<" ";
   blockSwapAlgo(arr, k, size);
   cout<<"\nArray after rotating "<<k<<" times :\t";
   for(int i = 0; i<size; i++)
      cout<<arr[i]<<" ";
   return 0;
}

输出结果

Array before rotations : 4 6 1 8 9 2
Array after rotating 3 times : 8 9 2 4 6 1

示例

程序来说明迭代方法-

#include <html" target="_blank">iostream>
using namespace std;
void swapSubArray(int arr[], int start, int end, int k){
   int temp;
   for(int i = 0; i < k; i++){
      temp = arr[start + i];
      arr[start + i] = arr[end + i];
      arr[end + i] = temp;
   }
}
void blockSwapAlgoIt(int arr[], int k, int size) {
   int i, j;
   if(k == 0 || k == size)
      return;
   i = k;
   j = size - k;
   while (i != j) {
      if(i < j){
         swapSubArray(arr, k-i, k+j-i, i);
         j -= i;
      }
      else{
         swapSubArray(arr, k-i, k, j);
         i -= j;
      }
   }
   swapSubArray(arr, k-i, k, i);
}
int main() {
   int arr[] = {4, 6, 1, 8, 9, 2};
   int size = sizeof(arr) / sizeof(arr[0]);
   int k = 3;
   cout<<"Array before rotations :\t";
   for(int i = 0; i<size; i++)
      cout<<arr[i]<<" ";
   blockSwapAlgoIt(arr, k, size);
   cout<<"\nArray after rotating "<<k<<" times :\t";
   for(int i = 0; i<size; i++)
      cout<<arr[i]<<" ";
   return 0;
}

输出结果

Array before rotations : 4 6 1 8 9 2
Array after rotating 3 times : 8 9 2 4 6 1
 类似资料:
  • 本文向大家介绍用于数组旋转的Java逆向算法程序,包括了用于数组旋转的Java逆向算法程序的使用技巧和注意事项,需要的朋友参考一下 以下是实现数组旋转的反向算法的Java程序- 示例 输出结果 名为Demo的类包含一个名为“ rotate_left”的函数。 数组以及数组需要旋转的量作为参数传递给函数。 数组的长度也分配给另一个变量。 定义了另一个名为“ array_reversal”的函数,该函

  • 本文向大家介绍用于数组旋转的Python逆向算法程序,包括了用于数组旋转的Python逆向算法程序的使用技巧和注意事项,需要的朋友参考一下 当需要反转旋转的数组时,将定义一个方法,该方法遍历列表并反转列表。定义了另一种方法,该方法旋转列表,并且定义了另一种方法,用于显示列表。一个简单的循环和索引用于实现此目的。 以下是相同的演示- 示例 输出结果 解释 定义了一个名为“ reverse_list”

  • https://www.hackerrank.com/challenges/ctci-array-left-rotation 对大小为 n 的数组执行左旋转操作会将数组的每个元素向左移动 1 个单位。例如,如果在数组 [1,2,3,4,5] 上执行 2 次左旋转,则数组将变为 [3,4,5,1,2] 执行 k 次旋转并打印。 这是我到目前为止得到的,但它只经过一次交互,看不出我做错了什么

  • 本文向大家介绍计算C ++中排序后的旋转数组中小于或等于给定值的元素,包括了计算C ++中排序后的旋转数组中小于或等于给定值的元素的使用技巧和注意事项,需要的朋友参考一下 给我们一个整数数组。该数组是已排序的旋转数组。目的是找到等于或小于给定数K的数组中的元素数。 方法是遍历整个数组并计算小于或等于K的元素。 输入值 输出结果 说明-元素<= 4是1,2,3,4 Count = 4 输入值 输出结

  • 问题内容: 因此,目标是将阵列中的元素正确旋转一次。举个例子; 如果, 则将成为 这是我所拥有的: 但是,这无法说明何时大于数组的长度。我读到我应该将更大的存储在另一个Array中,但是看到变量是不确定的,因此我不确定这是最好的解决方案。提前致谢。 问题答案: 在代码中添加一个模数组长度: 您还应该创建一个要复制到的新值,以免覆盖以后需要的值。

  • 问题内容: 是否可以轻松地“旋转” PHP中的数组? 像这样:1,2,3,4-> 2,3,4,1 为此有某种内置的PHP函数吗? 问题答案: 当前大多数答案都是正确的,但前提是您不关心索引: 输出: 要保留索引,您可以执行以下操作: 输出: 也许有人可以比我的四行方法更简洁地进行轮换,但这还是行得通的。