剑指offer之调整数组顺序使奇数位于偶数前面


题目要求:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。


实现思路一:(用空间换时间)生成一个与输入的整数数组相同大小的数组作为偶数部分的存放位置,调整完后再把偶数部分放回到原来数组的后面。int size = array.length;
   

int size = array.length;
		int position = 0;//记录奇数移到的位置,position+1表示奇数总个数
		int[] right = new int[size];//存放偶数顺序的数组
		int j = 0;
		for (int i = 0; i < size; i++) {
			if (array[i] % 2 != 0) {//若为奇数
				if (i == position) {//表示当前位置以前都是奇数
					position++;
					continue;
				}
				//交换奇偶数
				array[i] = array[i] ^ array[position];
				array[position] = array[i] ^ array[position];
				array[i] = array[i] ^ array[position];
				//将奇数的位置+1
				position++;
			} else {
				//存放偶数
				right[j++] = array[i];
			}
		}
		for (int i = position,k = 0; i < size&&k<j; i++ , k++) {
			array[i] = right[k];
		}
		right = null;

实现思路二:(利用插入排序的原理,经别人提醒)不断比较当前位置的值跟当前位置的前一位置的值,看是否满足前偶后奇的规则。

(快速排序的排序规则:若升序,则看是否满足前大后小,就是不断的把小数从后面一直忘前挪,这样就不会影响数组中未排序的数的相对顺序)

public static void reOrderArray1(int[] array) {
		int size = array.length;
		for (int i = 0; i < size - 1; i++) {//i标志着奇数序列的最后一个位置,i+1表示奇数总个数
			for (int j = i + 1; j > 0; j--) {//从下标i+1开始,不断往前比较
				//若当前下标指向的值为奇数,当前下标的前一位置的值为偶数,则交换两数的位置
				if (array[j] % 2 != 0 && array[j - 1] % 2 == 0) {
					array[j] = array[j] ^ array[j - 1];
					array[j - 1] = array[j] ^ array[j - 1];
					array[j] = array[j] ^ array[j - 1];
				}
			}
		}

	}
这边有一个注意点就是:不要完全模仿插入排序的结构,即不要在第二重循环的判断条件中判断是否符合前偶后奇的规则,这会造成交换的次数减少很多,原因是逻辑与运算的短路运算规则。第二重循环语言不要写成
for (int j = i + 1; j > 0 && array[j] % 2 != 0 && array[j - 1] % 2 == 0; j--)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值