數組元素前移、后移


將一個長度為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]);
  } 
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM