Microsoft 数组移位

传入一个数组如 {1,2,3,4,5,6,7} 
将数组前面 head的一个子集移到数组末尾end
如input numberOfElements=3,则{1,2,3,4,5,6,7}=>{4,5,6,7,1,2,3} 
input numberOfElements=5,则{1,2,3,4,5,6,7}=>{6,7,1,2,3,4,5}  
如何写出该算法?

方法一:用前部分逆置,后部分逆置,整个数组逆置。

注意数组名作形参的时候,会退化为指针,所以用sizeof(a)/sizeof(a[0])是求不出数组长度的,

目前只知道直接传入数组长度的方法。

View Code
 1 #include<iostream>
2 using namespace std;
3
4 void reverse(int array[],int start,int end)
5 {
6 for(int i=start; i<(end+start+1)/2; i++) //注意这里的写法。。。
7 {
8 array[i]^=array[end+start-i];
9 array[end+start-i]^=array[i];
10 array[i]^=array[end+start-i];
11 }
12 }
13
14 void MoveSubArrayToTheEnd(int array[], int numberOfElements,int length)
15 {
16 reverse(array,0,numberOfElements-2);
17 reverse(array,numberOfElements-1,length);
18 reverse(array,0,length);
19 }
20
21
22 int main()
23 {
24
25 int b[]= {0,1,2,3,4,5,6,7};
26 MoveSubArrayToTheEnd(b,6,sizeof(b)/sizeof(b[0])-1);
27 for(int i=0; i<=6; i++)
28 cout<<b[i]<<",";
29 cout<<b[7]<<endl;
30
31 }

第二种方法参考冒泡排序,用循环移位实现。。。

View Code
 1 #include<iostream>
2 using namespace std;
3
4 void MoveSubArrayToTheEnd(int array[], int numberOfElements,int length)
5 {
6 for(int i=0;i<numberOfElements;i++)
7 {
8 for(int j=0;j<length-1;j++)
9 {
10 array[j]+=array[j+1];
11 array[j+1]=array[j]-array[j+1];
12 array[j]=array[j]-array[j+1];
13 }
14 }
15 }
16
17 int main()
18 {
19
20 int b[]= {0,1,2,3,4,5,6,7};
21 MoveSubArrayToTheEnd(b,6,sizeof(b)/sizeof(b[0]));
22
23 for(int i=0; i<=6; i++)
24 cout<<b[i]<<",";
25 cout<<b[7]<<endl;
26 return 0;
27 }




原文地址:https://www.cnblogs.com/YipWingTim/p/2236775.html