原地交換一個數組中先後兩部分

     題目描述:數組

                             將n個整數存放到一維數組R中,將R中保存的序列循環左移p個位置(0<p<n),即將R中的數據由(X0,X1,....,Xn-1),變換爲(Xp,Xp+1,...Xn-1,X0,X1,...,Xp-1) .性能

                分析:假設前p個元素所構成集合爲A,後n-p個元素爲B集合,則有AB等於((A的逆置)*(B的逆置))的逆置,具體證實目前還不清楚。總的來講就是進行三個逆置操做便可完成此過程。code

#include<cstdio>

void Reverse(int R[],int from,int to){
     int temp,i;
     for(i=0;i<(to-from+1)/2;i++){//循環要逆置的元素個數次
           temp = R[from+i];
           R[from+i] = R[to-i];
           R[to-i] = temp;
     }
}

void Converse(int R[],int n,int p){
     Reverse(R,0,p-1);
     Reverse(R,p,n);
     Reverse(R,0,n);
}
int a[10] = {0,1,2,3,4,5,6,7,8,9};
int main()
{ 
     Converse(a,9,3);
	 for(int i=0;i<10;i++) printf("%d ",a[i]);
	 printf("\n");
     return 0;
}

 打印的結果爲:3,4,5,7,8,9,0,1,2.io

總結:但凡遇到相似的題目時,能夠想一想以逆置爲基礎,從而寫出較高性能。class

相關文章
相關標籤/搜索