算法題---數組元素循環右移


試設計一個算法,將數組A中的元素A[0]至A[n-1]循環右移k位,並要求只用一個元素大小的附加存儲,元素移動或交換次數為O(n).
分析:我們看這個數組123456,循環右移2位。先將數組逆序,654321,交換3次,然后交換前兩個,564321,然后右面四個數字逆序,則561234,交換2次,正好是6次,並且在交換數據的時候,只使用了一個附加存儲空間,正好滿足題意。
 

#include <stdio.h> #include <stdlib.h> #include<iostream> #define maxsize 20 int arr[maxsize];

using namespace std;

void exchange_tool(int* arr, int len)

{  int i;  

int temp;

 for (i = 0; i<(len + 1) / 2; i++)  {   temp = *(arr + i);   *(arr + i) = *(arr + len - i);   *(arr + len - i) = temp;}

}

void rotate(int*arr, int n, int m)

{  m = m%n;

 exchange_tool(arr, n);  

exchange_tool(arr, m);  

exchange_tool(arr + m, n - m);

}

int main()

{  int n, k, i;

 while (1)  {   

cout << "數組長度?" << endl;   cin >> n;  

 cout << "右循環幾位?" << endl;  

 cin >> k;

  cout << "輸入數字:" << endl;

  for (i = 0; i < n; i++)   {    cin >> *(&arr[i]); }

  rotate(arr, n, k);  

 for (i = 0; i < n-1; i++) {cout << arr[i] << " ";  }

 cout << arr[i] << endl;  

 cout << endl;

 }  

 return 0;

}

其中有2個地方要注意
1. for(i=0;i<(len+1)/2;i++),正好可以避開奇數和偶數的判斷,大家自己琢磨一下。
2.k = k%6;k的次數有可能大於6,,6的整數倍的右移還是本身,於是就求余吧。
其實這道題目一個元素的附加存儲空間都可以省去,因為交換兩個值不需要附加空間,我們有^.
如下:
void swap(char& a,char& b)
{
   a = a^b;
   b = a^b;
   a = a^b; 
}
這里用到了引用。大家推導一下,因為a^a = 0和a^0 = a。如果用指針的話,如下:
void swap(char* a,char* b)
{
   *a = *a^*b;
   *b = *a^*b;
   *a = *a^*b; 
}
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM