奇偶数排序

本文介绍了如何在O(n)的时间复杂度内对整数数组进行奇偶数排序,包括两种解法:头尾指针法和前后指针法。通过调整数组顺序,确保奇数位于前半部分,偶数位于后半部分。两种方法均借鉴了快速排序的思想,通过移动指针并适时交换元素来达到目标排序状态。
摘要由CSDN通过智能技术生成

题目描述:给定一个整数数组,请调整数组的顺序,使得所有奇数位于数组前半部分,所有偶数位于数组后半部分,
要求时间复杂度为O(n).

分析与解法:
最容易想到的办法是从头到尾扫描这个数组,每遇到一个偶数,就把他单独取出来,然后把该偶数后面的所有数往前移动一位,最后把该偶数放入数组的最末尾。因为每遇到一个偶数,需要移动O(N)个数,所以时间复杂故为O(N*N),不符合题目要求。

事实上,若把奇数看成是小数,偶数看成大数,那么按照题目要求的奇数放在偶数前面,就相当于小数放在大数的前面,有点像快排,就是通过一个主元把整个数组分成大小两个部分,小于主元的小数放在前面,大于主元的放在后面,划分过程有以下两种:

(1)一头一尾两个指针同时往中间扫,如果头指针遇到的数比主元大且尾指针遇到的数比主元小,交换头指针与尾指针
所指的数。

(2)一前一后两个指针同时从左往右扫,如果前指针遇到的数比主元小,则后指针右移一位,然后交换各自指向的数。与这个划分类似,奇偶排序也可以借鉴这两种方法。

解法一:一头一尾指针往中间扫
借鉴划分过程的第一种实现,可以考虑维护两个指针,一个指针指向数组的第一个数,称为头指针,向右移动,另一个指针指向最后一个数,称之为尾指针,向左移动。
这样,两个指针分别从数组的头部和尾部向数组的中间移动,如果第一个指针指向的数是偶数而第二个数指向的书是奇数,就交换这两个数字。因为按照题目要求,最终是为了让奇数排在

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值