1. 程式人生 > 其它 >線性表中的元素迴圈位移問題

線性表中的元素迴圈位移問題

技術標籤:資料結構

線性表中的元素迴圈位移問題

演算法設計思想

迴圈位移問題中,會將左移過程中越界的部分置於原線性表的尾部。同理,右移過程中則會將越界部分置於原線性表的首部。以左移為例做下列分析:

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;
}

演算法實現結果