整型数组的循环右移
/*實(shí)現(xiàn)整型數(shù)組的循環(huán)右移cycleMoveR1:臨時(shí)空間比較大,但是時(shí)間復(fù)雜度為O(1)cycleMoveR2:臨時(shí)空間比較小,時(shí)間復(fù)雜度為O(n)
*/#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>// 數(shù)組循環(huán)右移moveLen個(gè)
int cycleMoveR1(int arr[], int len, int moveLen)
{assert(len > 0 && moveLen > 0);moveLen = moveLen % len;int *p = malloc(moveLen * sizeof(int));if(NULL == p)return 0;memcpy(p, arr+len-moveLen, moveLen * sizeof(int)); // 保存將被右移出數(shù)組的元素memmove(arr+moveLen, arr, (len - moveLen) * sizeof(int)); // 將數(shù)組最前的元素右移moveLen個(gè)memmove(arr, p, moveLen * sizeof(int));free(p);return 1;
}// 數(shù)組循環(huán)右移moveLen個(gè)
int cycleMoveR2(int arr[], int len, int moveLen)
{assert(len > 0 && moveLen > 0);moveLen = moveLen % len;int i, j, t, p0, p1 = 0;for(i = 0; i < moveLen - p1; i++) // 循環(huán)moveLen-p1次{j = len - i - 1;p0 = j; // p0保存此輪最先空出來的元素的下標(biāo)t = arr[j];while(1){if(j - moveLen >= 0){arr[j] = arr[j - moveLen];j -= moveLen;}else{if(j - moveLen + len != p0){arr[j] = arr[j - moveLen + len];j = j - moveLen + len;p1++;}else{arr[j] = t;break;} }} }return 1;
}void display(int arr[], int len)
{int i = 0;for(; i < len; i++)printf("%d ", arr[i]);printf("\n");
}int main(int argc, char *argv[])
{int arr[] = {1, 2, 3, 4, 5, 6};int len = sizeof(arr)/sizeof(int);int moveLen = 0;do {printf("請(qǐng)輸入循環(huán)右移的個(gè)數(shù):");scanf("%d", &moveLen);if(moveLen <= 0)break;cycleMoveR2(arr, len, moveLen);display(arr, len);} while (1);return 0;
}
總結(jié)
- 上一篇: 《VMware vSphere设计(原书
- 下一篇: 带可变参数的宏函数和普通函数实现