课程设计题目:用 Reverse 实现时间复杂度为 O ( n ) O(n) O(n) 数组循环左移算法
一、问题描述
设计一个时间复杂度为 O ( n ) O(n) O(n) 的算法,实现将数组 A[n] 中所有元素循环左移 k k k 个位置。
详见王红梅等编著的《数据结构(C++版)(第2版)》P53页习题5(1)。
二、基本要求
-
实现将数组 A[n] 中所有元素循环左移 k k k 个位置。
-
时间复杂度为 O ( n ) O(n) O(n) 。
三、概要设计
1. 算法的设计
算法思路参考王红梅等编著的《数据结构(C++版)(第2版)》P16页思想火花,出自BW Kernighan和PJ Plauger于1981年发表的著作Software tools in Pascal。
-
设计
reverse(first, last)
函数,用于实现反转从first
到last
(不含)之间的元素; -
通过3次
reverse
实现将数组 A[n] 中所有元素循环左移 k k k 个位置:reverse(a, a + k)
reverse(a + k, a + n)
reverse(a, a + n)
四、详细设计
1. 设计每个函数
void Reverse(int *first, int *last)
{
last--;
for (int temp; first < last; first++, last--)
temp = *first, *first = *last, *last = temp;
}
2. 设计主函数
int main()
{
reverse(a, a + k);
reverse(a + k, a + n);
reverse(a, a + n);
}
五、运行与测试
1. 测试环境
运行环境:Windows 20H2, i7-9750H @ 2.60GHz, 16GB RAM
编译器:gcc version 8.1.0 (x86_64-posix-seh-rev0, Built by MinGW-W64 project)
编译命令:-g
运行终端:cmd
2. 在调试程序的过程中遇到的问题与解决方案
暂未发现异常。
3. 设计的测试数据与测试结果
测试3次。输入k
,然后生成一个随机数组并输出,数组所有元素循环左移 k k k</