将数组中的所有元素依次循环右移k个位置
2013-05-31 23:21
603 查看
原题:请设计一个时间复杂度为O(n),空间复杂度不超过O(2)的算法,该算法将数组array[0:n-1]中所有元素依次循环右移k个位置。
算法思想:以一个元素为起点,用pre_temp记下其值,然后将其右边相距k位的元素与其交换,再移动到下一个k位,继续下去,直到回到起点。注注意回到起点并不一定表示移动
结束。显然每交换一次只有一个数据到位,所以程序中用 m 记下交换的次数,当 m=n 时表明所有数据到位。
算法思想:以一个元素为起点,用pre_temp记下其值,然后将其右边相距k位的元素与其交换,再移动到下一个k位,继续下去,直到回到起点。注注意回到起点并不一定表示移动
结束。显然每交换一次只有一个数据到位,所以程序中用 m 记下交换的次数,当 m=n 时表明所有数据到位。
#include<stdio.h> #include<time.h> #include<stdlib.h> #define SIZE 10 void rightshift(int array[],int n,int k); //右移函数的原型声明 void main() { int array[SIZE],i,k; for(i=0;i<SIZE;i++) { array[i]=rand()%100+1; } printf("Before shifed,the array's elements are :\n"); for(i=0;i<SIZE;i++) { printf("%d ",array[i]); } printf("please input a number:\n"); scanf("%d",&k); rightshift(array,SIZE,k); //调用右移函数 printf("After shifed,the array's elements are :\n"); for(i=0;i<SIZE;i++) { printf("%d ",array[i]); } printf("\n"); } void rightshift(int array[],int n,int k) { int p,q,pre_temp,m,temp; p=0; m=0; q=p; pre_temp=array[p]; while(m<n) //每次移动只有一个数据到位,这里用m记下有多少个数据已到位 { do { q=(q+k)%n; temp=pre_temp; pre_temp=array[q]; array[q]=temp; m++; }while(p!=q); if(m<n) { ++p; q=p; pre_temp=array[p]; } } }
相关文章推荐
- 转:时间复杂度O(n)实现数组A[n]中所有元素循环左移k个位置
- 搜狐在线笔试 时间复杂度O(n)实现数组A[n]中所有元素循环左移k个位置
- boj 1347 简单数组问题 在一个二维数组中 a[i][j]=a[i][j]+a[i-1][j]+a[i][j-1]-a[i-1][j-1] 则a[i][j]为i j位置左上侧所有元素之和
- js数组循环遍历数组内所有元素
- 在数组 arr 中,查找值与 item 相等的元素出现的所有位置
- 【算法】将一维数组arr中的元素循环左移p个位置
- 利用javascript数组长度循环数组内所有元素
- 将一个具有n个元素的数组向左循环移动i个位置,使用O(n)复杂度
- 给定数组Arr[n],O(n)时间内找出每个元素左侧所有元素中位置最靠近该元素且大于该元素的元素
- 编写一个程序,循环从键盘接收一批学生的某门课的成绩,并依次保存在数组score的相应元素中,直到输入的成绩为999时结束。
- 整型数组处理算法(三)把一个数组里的所有元素,插入到另一个数组的指定位置
- 将数组中最大的元素放到数组最中间的位置,然后依次由大到小轮换放到左右两边
- 【大家来一起讨论吧】百度面试题,假设一整型数组存在若干正数和负数,现在通过某种算法使得该数组的所有负数在正数的左边,且保证负数件和正数间元素相对位置不变。时空复杂度要求:o(n),o(1)
- 求一个数组中所有元素的最大值及其索引位置
- 局部最小值位置、元素最左出现、循环有序数组最小值
- 利用javascript数组长度循环数组内所有元素
- 给定数组Arr[n],O(n)时间内找出每个元素左侧所有元素中位置最靠近该元素且大于该元素的元素
- iOS开发,一个数组,里面的元素依次的向后移动,移出的元素依次补到第一个位置
- js数组循环遍历数组内所有元素的方法
- JS数组循环遍历数组内所有元素的方法