首先,假設我們有乙個具有6個元素的陣列: 1,2,3,4,5,6
現在我們要對這個陣列迴圈右移4次,我們很直接很夠推出它的結果是:3,4,5,6,1,2 。但是我們如何去實現這樣乙個問題呢?
step1:儲存好陣列中最後乙個元素的值
step2:從第乙個元素到倒數第二個元素依次向右移動乙個位置
step3:然後將剛儲存的值放到空出來的陣列第乙個位置
雖然這個方法想起來很簡單,但是它的效率卻不是很高,它的時間複雜度是o(n^2)。
現在,我再介紹一種效率較高的演算法,這個演算法,充分利用了模數求餘的特點。
這種演算法的時間複雜度是o(n),比上一種演算法效率有了很大的提高。
它的主要實現步驟是這樣的:(記移動次數為move)
step1:初始化時,將pre_value初始化為陣列的第乙個元素
step2:從某個位置a(初始時a為0)開始開始(這裡的a,b......指的是陣列的下標所標誌的位置),將pre_value複製到臨時變數temp中,位置a加上移動的次數得到新的位置
b = a+move,
step3:儲存位置b原來的資料到pre_value中,再將變數temp中的值複製到位置b中
step4:重複上述步驟step2,step3 n次(n為陣列的長度),將所有的元素都更新到正確的位置後,就可以得到正確的移位後的陣列。
但是在這裡我們要注意到這樣乙個問題,可能存在這樣的一種情況
例如:將陣列1,2,3,4,5,6 利用上訴演算法迴圈右移3次,得到的結果將是
這裡我們看到這裡形成了乙個只有兩個元素的環,並沒有包括所有的元素,所以經過推算,我們得到這樣兩種情況下,應該作特殊處理,
情況一:移位次數是偶數
情況二:陣列長度%移位次數 == 0的情況
解決的辦法就是將一次移位動作劃分為多次不含上述兩種情況的移位動作,比如將一次偶數次的移位動作分解成先進行n-1次奇數次移位,再接著進行1次移位。
(注意:千萬要注意第二種情況的問題)
下面就是我實現的**:
1 #include 2 #include 34//執行結果:該函式對於陣列長度為偶數且移位的次數也為偶數情況不適用,對於陣列長度能整除移位次數的情況也要另加考慮5//
所以,對於偶數的情況,我們要分解成先移動count-1+1的組合
6void bufferrightshift(int buffer,int n,int
count)720
}212223
void ror(int buffer,int n,int
count)
2439
else
40break;41
}42 bufferrightshift(buffer,n,move-k);
43for(i=1;i<=k;i++)
44 bufferrightshift(buffer,n,1
);4546}
47else
4851}52
53int
main()
5469 printf("
%d\n
",a[n-1
]);70 free((void*)a);71}
72return0;
7374 }
陣列元素迴圈右移問題
乙個陣列a中存有n 0 個整數,在不允許使用另外陣列的前提下,將每個整數迴圈向右移m 0 個位置,即將a中的資料由 a0a1 an 1 變換為 an man m 1 a0a1 an m 2an m 1 最後m個數迴圈移至最前面的m個位置 如果需要考慮程式移動資料的次數盡量少,要如何設計移動的方法?輸...
陣列元素迴圈右移問題
written by bruth lee in southwest universiy of science and technology.乙個陣列 a中存有 n 個整數,在不允許使用另外陣列的前提下,將每個整數迴圈向右移 m 個位置,即將 a中的資料由 a 0 a 1 a n 1 變換為 a n ...
陣列元素迴圈右移問題
乙個陣列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個位置 如果需要考慮程式移動資料的次數盡量少,要如何設計移動的方...