题目:给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数。
思路分析:
# 奇数分类到低位,偶数分类到高位
# 从低位开始检查,如果是奇数就继续,直到遇到偶数停止;然后开始从高位开始检查,如果是偶数就继续,直到遇到奇数位置;
# 一轮检查完成后交换高位和低位停止的元素,然后进行下一轮检查,以此类推,直到高位和低位的差值为1时认为检查分类完成,退出。
python 代码实现:
def OddEvenSorter(arr):
# 处理空数组
if not arr:
return None
# 初始化奇数指针和偶数指针
odd_pointer = 0
even_pointer = len(arr) - 1
while True:
# 从奇数指针处开始检查当前元素是否为奇数,是奇数就向后继续检查,直到遇到偶数停下
while (arr[odd_pointer] % 2) == 1 and even_pointer - odd_pointer > 1:
odd_pointer += 1
# 从偶数指针处开始检查当前元素是否为偶数,是偶数就向后继续检查,直到遇到奇数停下
while arr[even_pointer] % 2 == 0 and even_pointer - odd_pointer > 1:
even_pointer -= 1
# 此时的奇数指针所指元素为偶数,偶数指针指向奇数,所以交换奇偶指针处的元素
tmp = arr[odd_pointer]
arr[odd_pointer] = arr[even_pointer]
arr[even_pointer] = tmp
# 如果奇偶指针相差为1则停止检查
if even_pointer - odd_pointer <= 1:
break
测试:
if __name__ == "__main__":
a = [1, 2,3 ,8, 19, 30, 88, 76,31]
OddEvenSorter(a)
print(a)
java实现:
package test;
import java.util.Arrays;
public class Sort {
public static void main(String[] args){
int[] str = new int[]{1,4,53,6,2,43,45,2,6};
System.out.println(Arrays.toString(sortStr(str)));
}
public static int[] sortStr(int[] str){
int pre=0;
int post = str.length-1;
int temp;
if (str.length<=1){
return str;
}
while(true){
//是奇数
while(str[pre]%2==1 && pre<post){
pre++;
}
//是偶数
while(str[post]%2==0 && pre<post){
post--;
}
if(pre<post){
temp = str[pre];
str[pre]= str[post];
str[post] = temp;
}else{
break;
}
}
return str;
}
}