演算法習題---線性表之數組實現迴圈移動

來源:互聯網
上載者:User

標籤:nbsp   ever   迴圈   info   sys   temp   數組   迴圈移動   .com   

一:問題
設將n(n>1)個整數存放到一維數組R中,試設計一個在時間和空間兩方面都儘可能高效的演算法,將R中儲存的序列迴圈左移p(0<p<n)個位置,
即把R中的資料序列由(x0,x1,…,xn-1)變換為(xp,xp+1,…,xn-1,x0,x1,…,x)。
二:思考
要實現R中序列迴圈左移P個位置,只需先將R中前P個元素逆置,再將剩下的元素逆置,最後將R中所有的元素再整體做一次逆置操作即可,本題演算法描述如下:

(一)步驟一:將前P個元素逆置

(二)步驟二:將後P個元素逆置

 

(三)步驟三:將所有元素逆置(實現)

三:代碼實現
void Reverse(int R[], int l, int r){    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 MoveL(int R[], int n, int p){    if (p <= 0 || p >= n)        return;    Reverse(R, 0, p - 1);    Reverse(R, p, n - 1);    Reverse(R, 0, n - 1);}
int main(){    int a[7] = { 1, 2, 3, 4, 5, 6, 7 };    MoveL(a, 7, 3);    for (int i = 0; i < 7; i++)        printf("%d", a[i]);    system("pause");    return 0;}

四:效能分析
時間複雜度是O(n),空間複雜度為O(1)
五:補充---右移
void MoveR(int R[], int n, int p){    if (p <= 0 || p >= n)        return;    Reverse(R, 0, n - 1);    Reverse(R, 0, p - 1);    Reverse(R, p, n - 1);}

六:總結左移和右移(一)左移:將R中前p個元素逆置,剩下逆置,整體逆置 (二)右移:整體逆置,前p逆置,後p逆置

 

演算法習題---線性表之數組實現迴圈移動

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.