陣列元素迴圈移動

2021-08-18 23:35:51 字數 3226 閱讀 4998

4. 結論:

陣列元素迴圈移動分為迴圈左移和迴圈右移。

由於兩種情況類似。就以迴圈右移為例。

將陣列中的元素迴圈向右移動。

右移一位時,陣列最後乙個元素跑到了陣列第乙個位置,陣列其餘元素統一向後挪動乙個位置。

右移 m 位時,連續執行 m 次 「右移一位」 的操作。

現有整型陣列

a=[

1,2,

3,4,

5,6]

\color

a=[1,2

,3,4

,5,6

]

迴圈向右移動兩次,得到的結果應該是

a=[

5,6,

1,2,

3,4]

\color

a=[5,6

,1,2

,3,4

]

基本思想:將陣列元素迴圈右移 m 次,每一次的操作如下圖下標0

1234

5元素12

3456

乙個整型變數 temp 儲存最後乙個位置的元素 tem

p=a[

leng

th−1

]\color

temp=a

[len

gth−

1];然後將其餘元素從下標 length-2 到下標 0 的元素右移乙個位置;下標0

1234

5元素11

2345

將 temp中的值存放到陣列下標 0 的位置;完成一次右移操作。下標0

1234

5元素61

2345

c**如下:

/* 函式功能:從控制台讀入n個整型資料,存入陣列中,並將陣列迴圈右移m位 */

// 這裡假設n>0,m>=0,是合法的數字。

void

cyclicshiftright

(int n,

int m)

// process.

/* 迴圈右移的結果和右移的前n(陣列長度)個結果一致,所以做取餘操作。*/

m = m % n;

// 如果取餘操作之後的m等於0,則不需要移動if(

0== m)

// 如果取餘操作之後的m不等於0,則需要右移

else

// 將temp中儲存的元素值放入第乙個位置(下標值為0)。

testarray[0]

= temp;}}

// output.

for(

int i =

0; i < n;

++i)

}printf

("\n");

free

(testarray)

; testarray =

null;}

intmain()

假設迴圈右移 2 次(迴圈右移 8 次與其結果一致,因為 8%6 == 2),正確結果應該如下表下標0

1234

5元素56

1234

觀察結果發現結果陣列分為 2 個部分,一組有 2 個元素 「5」 和 「6」 保持有序,另一組 4 個元素 「1」 、「2」、「3」 和 「4」 保持有序。

於是將原陣列看作兩個部分,一組有 2 個元素保持有序,另一組 4 個元素保持有序,結果如下下標0

1234

5元素12

3456

將兩個陣列中的元素,每個部分陣列第乙個元素和自身最後乙個元素交換,第二元素和倒數第二個元素交換,以此類推… …下標0

1234

5元素43

2156

↓ 下標0

1234

5元素43

2165

然後整個陣列看作乙個整體,執行以上操作下標0

1234

5元素56

1234

此時得到了正確的結果。

c**如下:

/* 函式功能:交換陣列testarray中下標firstindex和下標secondindex的元素*/

/* 這裡假設傳入的引數都是正確的,即testarray不能為空,firstindex和secondindex下標值是合法的(不能越界)。*/

void

swap

(int testarray,

int firstindex,

int secondindex)

else

}/* 函式功能:將陣列testarray下標從leftindex到rightindex,包含leftindex和rightindex的元素進行反轉(翻轉)。*/

/* 這裡假設傳入的引數都是正確的,即testarray不能為空,leftindex和rightindex下標值是合法且合理的(不能越界並且leftindex < rightindex)。*/

void

reversearray

(int testarray,

int leftindex,

int rightindex)

}/* 函式功能:從控制台讀入n個整型資料,存入陣列中,並將陣列迴圈右移m位 */

// 這裡假設n>0,m>=0,是合法的數字。

void

cyclicshiftright

(int n,

int m)

// process.

/* 迴圈右移的結果和右移的前n(陣列長度)個結果一致,所以做取餘操作。*/

m = m % n;

// 如果取餘操作之後的m等於0,則不需要移動if(

0== m)

// 如果取餘操作之後的m不等於0,則需要右移

else

// output.

for(

int i =

0; i < n;

++i)

}printf

("\n");

free

(testarray)

; testarray =

null;}

intmain()

以上兩種**在microsoft visual studio 2015 以及 microsoft visual studio 2017上執行成功。

第一種演算法由於要移動大量(陣列很大的時候)的元素,效率不如第二種高。第二種演算法更高效,時間複雜度低,優先考慮。

陣列元素迴圈右移

1008.陣列元素迴圈右移問題 20 時間限制 400 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 乙個陣列a中存有n n 0 個整數,在不允許使用另外陣列的前提下,將每個整數迴圈向右移m m 0 個位置,即將a中的資料由 a0 a1 an 1 變換為 a...

PAT乙級考試記錄之陣列元素迴圈向右移動

乙個陣列a中存有n 0 個整數,在不允許使用另外陣列的前提下,將每個整數迴圈向右移m 0 個位置,即將a中的資料由 a 0 a 1 a n 1 變換為 a n m a n 1 a 0 a 1 a n m 1 最後m個數迴圈移至最前面的m個位置 如果需要考慮程式移動資料的次數盡量少,要如何設計移動的方...

陣列元素迴圈右移問題

乙個陣列a中存有n 0 個整數,在不允許使用另外陣列的前提下,將每個整數迴圈向右移m 0 個位置,即將a中的資料由 a0a1 an 1 變換為 an man m 1 a0a1 an m 2an m 1 最後m個數迴圈移至最前面的m個位置 如果需要考慮程式移動資料的次數盡量少,要如何設計移動的方法?輸...