將一個長度為N的數組依次前移K位。
取數組長度為9,前移5位並通過表格來解釋。
第一次找到一個標志位(這個標志位是為了解釋方便而特意取的一個),通過標志位將表格分成了兩部分,分別對這兩部分進行逆置
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|
通過逆置得到結果
5 | 4 | 3 | 2 | 1 | 9 | 8 | 7 | 6 |
---|
第二次對整個表格逆置
6 | 7 | 8 | 9 | 1 | 2 | 3 | 4 | 5 |
---|
這樣就得到了元素依次前移五位后的數組。
void swap(int array[N],int m,int n){ int temp; for(int i = m;i<=((n-m)/2+m);i++){ temp = array[n-i+m]; array[n-i+m] = array[i]; array[i] = temp; } }
數組前移已經知道怎么處理了,但是數組后移又該怎么處理?
還是通過一個表格解釋
第一次:對整個表格逆置
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|
得到結果:
9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
---|
第二次:分別對表格兩個部分逆置
5 | 6 | 7 | 8 | 9 | 1 | 2 | 3 | 4 |
---|
其實數組元素前移、后移本質上是一樣的。其區別僅僅在於前移是先將數組的兩個部分分別逆置然后整體逆置,而數組后移是先對數組進行整體逆置然后再部分逆置。
看到這里可能有一個疑問:標志位(即表格中的空格)是怎么選取的?
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|
表格元素前移五位的結果是:
6 | 7 | 8 | 9 | 1 | 2 | 3 | 4 | 5 |
---|
分割一下:
6 | 7 | 8 | 9 | 1 | 2 | 3 | 4 | 5 |
---|
可以看見1-5整體在空格后面,6-9整體在空格前面。所以需要考慮的問題是怎樣將這兩部分分別放到空格的兩邊。
1 | 2 | 3 | 4 | 5 |
---|
逆置
5 | 4 | 3 | 2 | 1 |
---|
對於
6 | 7 | 8 | 9 |
---|
逆置
9 | 8 | 7 | 6 |
---|
再合並
5 | 4 | 3 | 2 | 1 | 9 | 8 | 7 | 6 |
---|
逆置
6 | 7 | 8 | 9 | 1 | 2 | 3 | 4 | 5 |
---|
最終代碼:
#include<stdio.h> #define N 9 //數組大小 #define K 5 //前移位數 void swap(int array[N],int m,int n){ int temp; for(int i = m;i<=((n-m)/2+m);i++){ temp = array[n-i+m]; array[n-i+m] = array[i]; array[i] = temp; } } int main(void){ int array[N]; for(int i=0;i<N;i++){//初始化 array[i] = i+1; } //前移 swap(array,0,N-1); swap(array,0,K-1); swap(array,K,N-1); //后移 /* swap(array,K,N-1); swap(array,0,N-1); swap(array,0,K-1); */ //輸出 for(int i=0;i<N;i++){ printf("%d ",array[i]); } }