剑指offer面试题21:调整数组顺序使奇数位于偶数之前(Java实现)不改变先后顺序

本文介绍了一种算法,用于将整数数组中的奇数和偶数分别放置在数组的前半部分和后半部分。首先通过双指针技术实现初步分离,但会破坏原有顺序。随后提出使用栈思想改进算法,确保奇偶数正确排序且保持原数组中数字的相对位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有技术位于数组的前半部分,所有偶数位于数组的后半部分。

直接上代码:

private static void sortArray1(int[] array) {
		int start = 0;
		int end = array.length - 1;
		while (start != end) {
			if (array[start] % 2 == 0) {
				for (int j = end; j >= 0; j--) {
					if (array[j] % 2 == 1) {
						int swap = array[start];
						array[start] = array[j];
						array[j] = swap;
						break;
					}
					end--;
				}
			}
			start++;
		}
		for (int i = 0; i < array.length; i++) {
			System.out.print(array[i] + ",");
		}
	}


//int[] array = { 1, 2, 3, 4, 5, 6, 7 };
//结果1,7,3,5,4,6,2,

分析:

指定两个指针一个从头,一个从尾。头指针如果遇到奇数跳过,遇到偶数和尾指针(此时为奇数时)进行交换。

但是这样排序的结果不是很理想。因为 破坏了原有的排序;例如 定义一个array[] = {1,2,3,4,5,6,7}; 

排序后的结果为{1,7,3,5,4,6,2};   在原数组中{2]位于{4}的前面,但是现在反而变成了后面;

我们要的顺序因该是{1,3,5,7,2,4,6,}  

解决方案:我们可以采用栈的思想,先经过遍历将所有的奇数压入堆栈,再将所有的偶数压入堆栈。然后覆盖原数组;

private static void sortArray(int[] number) {
		Stack<Integer> stack = new Stack<>();
		for (int i = 0; i <= number.length - 1; i++) { //将奇数压入
			if (number[i] % 2 == 1) {
				stack.push(number[i]);
			}
		}
		for (int j = 0; j <= number.length - 1; j++) {//将偶数压入
			if (number[j] % 2 == 0) {
				stack.push(number[j]);
			}
		}
		for (int i = number.length - 1; i >= 0; i--) {
			number[i] = stack.pop();			//替代所有原数组
		}
		for (int i = 0; i < number.length; i++) {
			System.out.print(number[i] + ",");
		}
	}

结果如预期一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值