题目描述
题目一:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分。
题目二:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
思路分析
针对题目一,不要求调整后的数组奇数和偶数的相对位置不变,有两种比较直观的解法:
(1)从头遍历这个数组,遇到一个偶数时就拿出这个数字,并把位于这个数字后面的所有数字前移,将该偶数放入数组的末尾,该解法的时间复杂度为O(n2)。
(2)采用快速排序的思想:可以定义两个指针i和j,i指向数组第一个元素,j指向数组最后一个元素,j从后向前扫描,i从前向后扫描,要求j始终指向偶数,i始终指向奇数,当j指向的是奇数,i指向的是偶数的时候,互换二者指向的数字。一直循环直到i>j为止。
针对题目二,要求奇数和偶数的相对位置不变,也有两种比较直观的解法:
(1)采用冒泡排序的思想,每一趟从最后一个元素开始,将它与前一个元素比较,如果前一个元素为偶数,后一个元素为奇数,则互换二者的位置,一共要循环n-1趟,时间复杂度为O(n2)。也可以采用直接插入排序的思想,很简单,在此不再赘述。
(2)空间换时间,定义两个数组,分别存储array[]中的元素,然后将两个数组的元素赋值给array[]。
java实现
题目一(1)
public void reOrderArray(int [] array) {
for (int i = 0; i < array.length; i++){
if((array[i]&0x1)==0){
int tmp = array[i];
for(int j = i+1; j < array.length; j++)
array[j-1] = array[j];
array[array.length-1] =tmp;
}
}
}
题目一(2)
//quickSort思想
public void reOrderArray(int [] array) {
if(array == null)
return;
int i = 0;
int j = array.length - 1;
int tmp = 0;
while(i<j){
//注意此时只有i<j的时候才需要继续遍历所以这个条件在前面
//因为当j指向偶数,i指向奇数的时候,两个指针需要不断的向前或向后扫描,而不是1次就结束了,所以此处必须用while,而不能用if!
//还要注意数组元素与数组下标的区别。。。这种低级错误不能犯。。。是判断数组元素的奇偶性,而不是数组下标的!!
while((i<j)&&(array[j] & 1)==0)
j--;
while((i<j)&&(array[i] &1) == 1)
i++;
if(i<j){
tmp = array[i];
array[i] = array[j];
array[j] = tmp;
//j--;
// i++;
}
}
}
题目二(1)
public void reOrderArray(int [] array) { //bubbleSort思想
int tmp = 0;
for(int i = 0; i < array.length - 1; i++){
for(int j = array.length-1; j>i;j--){
//如果偶数在前奇数在后,则互换两个元素的位置
if(((array[j-1]&0x1)==0)&&((array[j]&0x1)==1)){
tmp=array[j];
array[j]=array[j-1];
array[j-1]=tmp;
}
}
}
}
//直接插入排序思想
public void reOrderArray(int [] a) {
int n = a.length;
for(int i=1;i<n;i++){
int j = i-1;
int tmp=a[i];
while(j>=0&&((a[j]&0x1)==0)&&(tmp&0x1)==1){
a[j+1]=a[j];
j--;
}
a[j+1]=tmp;
}
}
题目二(2)
public void reOrderArray(int [] array) {
int count= 0;//保存数组中奇数的个数
for(int i =0;i<array.length;i++){
if((array[i]&0x1)==1)
count++;
}
int[] tmp1 = new int[count];//暂存数组,保存奇数
int[] tmp2 = new int[array.length-count];//暂存数组,保存偶数
int oddNum=0, evenNum=0;
for(int i =0;i<array.length;i++){
if((array[i]&0x1)==1)
tmp1[oddNum++]=array[i];
else
tmp2[evenNum++]=array[i];
}
for(int i = 0;i<tmp1.length;i++)
array[i]=tmp1[i];
for(int i=0,j=count; i<tmp2.length;i++,j++)
array[j]=tmp2[i];
}