题目描述
在一个N个整数数组里面,有多个奇数和偶数,设计一个排序算法,令所有的奇数都在左边。
请完成sort的代码实现
void sort(int[]a)
{
}
例如: 当输入a = {8,4,1,6,7,4,9,6,4},
a = {1,7,9,8,4,6,4,6,4}为一种满足条件的排序结果。
参考思路1:
(1)快慢指针同时从一侧出发,找到第一个偶数时,慢指针(pre)停下来,快指针(pos)寻找下一个奇数,找到就交换,
(2)然后快慢指针+
1
继续。
时间复杂度为O(n)
public class MyClass {
public static void main(String args[]) {
int [] a = new int[]{8,4,1,6,7,4,9,6,4};
for(int i = 0; i<a.length; i++)
{
System.out.print(a[i]);
}
System.out.println();
sort(a);
}
public static void sort(int arr[])
{
int len = arr.length;
int pre = 0;
int pos = 0;
boolean flag = true;
for(; pos<len;pos++)
{
if(flag && arr[pos] % 2 == 0)
{
pre = pos;
flag = false;//执行第(1)步
}
if(!flag && arr[pos] % 2 == 1)
{
int temp = arr[pos];
arr[pos] = arr[pre];
arr[pre] = temp;
pre++;//执行第(2)步,pos++在for循环里面执行了
}
}
// 查看整个数组奇偶交换成功与否
for(int j = 0; j< arr.length; j++)
{
System.out.print(arr[j]);
}
}
}
输出结果:
841674964
179644864
参考思路2:
(1)设置begin, end两个指针,begin指向数组的偶数,end指向数组的奇数;
(2)交换偶数和奇数,同时begin++,end--;
public class MyClass {
public static void main(String args[]) {
int [] arr = new int[]{8,4,1,6,7,4,9,6,4};
for(int i = 0; i<arr.length; i++)
{
System.out.print(arr[i]);
}
System.out.println();
sort(arr);
}
public static void sort(int a[])
{
int begin = 0, end = a.length - 1;
while(begin < end)
{
if(a[begin] % 2 == 0 && a[end] % 2 == 1)
{
int temp = a[begin];
a[begin] = a[end];
a[end] = temp;
}
else if(a[begin] % 2 == 1)
{
begin++;
}
else if(a[end] % 2 == 0)
{
end--;
}
}
for(int jj = 0; jj< a.length; jj++)
{
System.out.print(a[jj]);
}
}
}
打印结果:
841674964
971644864