题目:输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,
所有偶数位于数组的后半部分。要求时间复杂度为O(n)。
针对这个题目,我们可以维护两个指针,一个指针指向数组的第一个数字,向后移动;一个指针指向最后一个数字,向前移动。分四种情况:
1.如果后一个指针指向奇数而前一个指针指向偶数,则交换两个数;之后,前一个指针继续向后移动,后一个指针继续向前移动;
2.如果后一个指针指向奇数而前一个也指针指向奇数,则前一个指针继续向后移动,后一个指针位置不变;
3.如果后一个指针指向偶数而前一个指针也指向偶数,则前一个指针位置不变,后一个指针继续向前移动;
4.如果后一个指针指向偶数而前一个指针指向奇数,则前一个指针继续向后移动,后一个指针继续向前移动;
所有偶数位于数组的后半部分。要求时间复杂度为O(n)。
针对这个题目,我们可以维护两个指针,一个指针指向数组的第一个数字,向后移动;一个指针指向最后一个数字,向前移动。分四种情况:
1.如果后一个指针指向奇数而前一个指针指向偶数,则交换两个数;之后,前一个指针继续向后移动,后一个指针继续向前移动;
2.如果后一个指针指向奇数而前一个也指针指向奇数,则前一个指针继续向后移动,后一个指针位置不变;
3.如果后一个指针指向偶数而前一个指针也指向偶数,则前一个指针位置不变,后一个指针继续向前移动;
4.如果后一个指针指向偶数而前一个指针指向奇数,则前一个指针继续向后移动,后一个指针继续向前移动;
public class Test {
public static void main(String[] args)
{
oddEvenSort(new int[]{1,2,3,4,5,6,6,6,66,7,8,9,10,11,1,1,1,1,1,14,15});
}
public static void oddEvenSort(int[] arr)
{
int temp;
for(int i = 0, j = arr.length-1; i < j;)
{
if(arr[j]%2 == 1)
{
if(arr[i]%2 == 0)
{
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
i++;
j--;
}
else
{
i++;
}
}
else
{
if(arr[i]%2 == 0)
{
j--;
}
else
{
i++;
j--;
}
}
}
for(int i : arr)
{
System.out.print(i + ",");
}
}
}