• n元一维向量向左循环移位i的几种算法


    1、最简单的算法借助于一个n元的中间向量在n步时间内完成

    时间复杂度:O(n)  空间复杂度O(n)

     1 void shift_easy(int arr[], int _arr[], int n, int i){
     2     int j = 0;
     3 
     4     while(i < n){
     5         _arr[j++] = arr[i++];
     6     }
     7     i = 0;
     8     while(j < n){
     9         _arr[j++] = arr[i++];
    10     }
    11 
    12 }

    2、使用翻转的思路完成一个不需要额外空间、编写简单并且实际运行很快的算法

    时间复杂度:O(n)

     1 void swap(int arr[], int i, int j){
     2     int temp;
     3     temp = arr[i];
     4     arr[i] = arr[j];
     5     arr[j] = temp;
     6 }
     7 
     8 void reverse_shift(int arr[], int n, int i){
     9     int j , k;
    10 
    11     j = 0;
    12     while(j < (i - j - 1)){
    13         swap(arr, j, i- j- 1);
    14         j++;
    15     }
    16     j = i;
    17     k = 0;
    18     while(j < (n - k - 1)){
    19         swap(arr, j, n - k -1);
    20         j++;
    21         k++;
    22     }
    23     j=0;
    24     while(j < (n - j - 1)){
    25         swap(arr, j, n - j -1);
    26         j++;
    27     }
    28 }

    3、在O(n)时间内完成、不需要额外空间的杂技算法

    原理是:将x[0]移动到t,将x[i]移动到x[0],将x[2i]移动到x[i](将x的下标对n取模),直到返回取x[0]中的元素,此时改为从t取值并停止过程。如果该过程没有移动全部元素,就从x[1]开始再次移动,直到所有的元素都移动为止。

     1 int gcd(int a, int b){
     2     int temp;
     3     if(b == 0)
     4         return a;
     5     do{
     6         temp = a % b;
     7         a = b;
     8         b = temp;
     9     }while(b != 0);
    10     return a;
    11 }
    12 
    13 void acrob_shift(int arr[], int n, int rotdist){
    14     int j, k, i, temp;
    15 
    16     for(i = 0; i < gcd(rotdist, n); i++){
    17         temp = arr[i];
    18         j = i;
    19         while(1){
    20             k = j + rotdist;
    21             if(k >= n)
    22                 k -= n;
    23             if(k == i)
    24                 break;
    25             arr[j] = arr[k];
    26             j = k;
    27         }
    28         arr[j] = temp;
    29     }
    30 }

    4、块交换算法(效率最高)

     1 void swap_block(int arr[], int sp1, int sp2, int s){
     2     int temp;
     3     while(s > 0){
     4         temp = arr[sp1 + s -1];
     5         arr[sp1 + s - 1] = arr[sp2 + s - 1];
     6         arr[sp2 + s - 1] = temp;
     7         s--;
     8     }
     9 }
    10 
    11 void block_shift(int arr[], int n, int rotdist){
    12     int i, j, p;
    13     if(rotdist == 0 || rotdist == n)
    14         return;
    15     i = p = rotdist;
    16     j = n - p;
    17     while(i != j){
    18         if(i > j){
    19             swap_block(arr, p-i, p, j);
    20             i -= j;
    21         }
    22         else{
    23             swap_block(arr, p-i, p+j-i, i);
    24             j -= i;
    25         }
    26     }
    27     swap_block(arr, p-i, p, i);
    28 }
  • 相关阅读:
    arcgis server10.2自带打印模板路径
    【js笔记】数组那些事[0]
    微信打开网页不能下载的解决
    CSS里一个奇怪的属性
    存一些有用的CSS
    【JS笔记】闭包
    关于百度空间的关闭
    数据校验插件开发
    JavaScript 内存机制
    手写JQuery 的框架的实现
  • 原文地址:https://www.cnblogs.com/lwyeah/p/8621536.html
Copyright © 2020-2023  润新知