線性表中的元素迴圈位移問題
阿新 • • 發佈:2021-01-14
技術標籤:資料結構
線性表中的元素迴圈位移問題
演算法設計思想
迴圈位移問題中,會將左移過程中越界的部分置於原線性表的尾部。同理,右移過程中則會將越界部分置於原線性表的首部。以左移為例做下列分析:
1、線性表的元素迴圈左移,越界部分為A,為越界部分為B。原序列即為AB。
2、這樣迴圈左移就可以視為是將原序列(AB)轉換成序列(BA)
3、先將A序列置為逆序,即(-A)
4、再將B序列置為逆序,即(-B)
5、此時原序列轉化為了((-A)(-B))
6、最後將整個序列在置為逆序,最終得到(BA)
問題概述
設將n(n>1)個整數存放到一維陣列R中,設計一個演算法,將R中的序列迴圈左移P(0<P<n)個位置,即將R中的資料由{X0,X1,...,Xn-1}變換為{Xp,Xp+1,X,...,Xn-1,X0,X1,...,Xp-1}。
演算法實現
#include<bits/stdc++.h> #define N 50 using namespace std; void Reverse(int R[],int l,int r){//將A和B部分內的元素置為逆序 int i,j; int temp; for(i=l,j=r;i<j;++i,--j){ temp=R[i]; R[i]=R[j]; R[j]=temp; } } void RCR(int R[],int n,int p){//將陣列整體元素置為逆序 if(p<=0||p>=n) cout<<"ERROR!"<<endl; else{ Reverse(R,0,p-1); Reverse(R,p,n-1); Reverse(R,0,n-1); } } int main(){ int l,i; int R[N],n; cout<<"輸入位置偏移量:"; cin>>l; cout<<endl; cout<<"輸入陣列長度:"; cin>>n; cout<<endl; cout<<"輸入陣列元素:"; for(int i=0;i<=n-1;++i) cin>>R[i]; RCR(R,n,l); for(int i=0;i<=n-1;++i) cout<<R[i]<<" "; cout<<endl; return 0; }