一个优雅的反转数组的算法


反转数组指的是把一个倒置,如下:
原始数组:
[1,11,4,2]
` 反转后的数组:
[2,4,11,1]
` 比较简单粗暴的方法是,遍历原始数组从最后一项向前遍历,然后把输出结果保存在一个新的数组里面,这样就完成了所谓的反转。
虽然方法行的通,但性能却一般,更好的办法是通过交换实现,即第一项与最后一项交换,第二项与倒数第二项交换,依次类推,只需要遍历数组的一半的大小交换,就可以完成反转。这种思路有点类似于高斯求和的理论,只不过那里面是相加,我们这里是交换,其中:
遍历的次数=数组的长度/2
这里不分数组的长度是偶数还是奇数,如果是奇数那么中间的一位数是不需要交换的,如果是偶数则刚好对半交换,所以这里交换的次数总是等于(len/2),注意计算机算len/2都是舍一取整:
10/3=3
9/3=3
所以这里刚好就是交换的次数,利用这种方式完成交换比较简单优雅,同时不需要新生成数组空间,直接在原数组上改动即可。
Java版本代码如下:
static void reverseArray(){
int array[]={1,2,5,4};
System.out.println("原始数组:"+Arrays.toString(array));
//数组的长度
int n=array.length;
//只需要循环长度的一半的次数即可完成反转
for (int j = 0; j <n/2 ; j++) {
int temp=array[j];//获取前半部分数组的每一个元素