赞
踩
// 逆置元素算法
void Reverse(int R[] , int l , int r){
// R 数组,l 左边 r 右边
int i , j ,temp;
for(i=l , j=r; i < j; i++,j--){ // i < j 不过数组个数是奇数还是偶数都行
temp = R[i];
R[i] = R[j];
R[j] = temp;
}
}
注意:逆置算法很简单,但是能延申其他的算法
// 逆置元素算法 void Reverse(int R[] , int l , int r){ // R 数组,l 左边 r 右边 int i , j ,temp; for(i=l , j=r; i < j; i++,j--){ temp = R[i]; R[i] = R[j]; R[j] = temp; } } // 循环左移算法 void LeftMove(int R[] , int n , int p){ // r 数组 n 数组元素个数 p 循环左移个数 if(p<0 || p>n){ cout <<"ERROR"<<endl; }else{ Reverse(r , 0 , p-1); // 先逆置前p个 Reverse(r , p , n-1); // 再逆置后n-p个 Reverse(r , 0 , n-1); // 最后再把所有的都逆置 } }
①:第一行 Reverse 执行频度为:1 + (p-1-0+1)/2
②:第二行 Reverse 执行频度为:1 + (n-1-p+1)/2
③:第三行 Reverse 执行频度为:1 + (n-1-0+1)/2
f(n) = 3 + n
T(n) = O(f(n)) = O(n)
由于可以看到在 整个算法中,我们只定义了变量,并未定义其他数据结构,也未使用递归,所以空间复杂度是常数级别。为 O(1)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。