4. 結論:
陣列元素迴圈移動分為迴圈左移和迴圈右移。
由於兩種情況類似。就以迴圈右移為例。
將陣列中的元素迴圈向右移動。
右移一位時,陣列最後乙個元素跑到了陣列第乙個位置,陣列其餘元素統一向後挪動乙個位置。
右移 m 位時,連續執行 m 次 「右移一位」 的操作。
現有整型陣列
a=[迴圈向右移動兩次,得到的結果應該是1,2,
3,4,
5,6]
\color
a=[1,2
,3,4
,5,6
]
a=[基本思想:將陣列元素迴圈右移 m 次,每一次的操作如下圖下標05,6,
1,2,
3,4]
\color
a=[5,6
,1,2
,3,4
]
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個位置 如果需要考慮程式移動資料的次數盡量少,要如何設計移動的方法?輸...