调整数组顺序使奇数位于偶数前面
一开始想着暴力,后来才发现那个就是插入排序的思想,后来用归并排序给做出来了,下面是我的代码和别人的解法
public class Solution {
public void reOrderArray(int [] array) {
helper(array,0,array.length-1);
}
public void helper(int[] array,int l,int r)
{
if(l>=r)
return ;
int mid=l+(r-l)/2;
helper(array,l,mid);
helper(array,mid+1,r);
int[] aux=new int[r-l+1];
for(int i=l;i<=r;i++)
aux[i-l]=array[i];
int index=l;
int left=r+1;
int right=r+1;
for(int i=l;i<=mid;i++)
if(aux[i-l]%2==1)
array[index++]=aux[i-l];
else
{
left=i;
break;
}
for(int i=mid+1;i<=r;i++)
{
if(aux[i-l]%2==1)
array[index++]=aux[i-l];
else
{
right=i;
break;
}
}
for(;left<=mid;left++)
array[index++]=aux[left-l];
for(;right<=r;right++)
array[index++]=aux[right-l];
return ;
}
}
//下面是别人的实现分别用归并和插排实现的:
链接:https://www.nowcoder.com/questionTerminal/beb5aa231adc45b2a5dcc5b62c93f593?answerType=1&f=discussion
来源:牛客网
1.归并排序法,使用链表或数组容器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
import java.util.ArrayList; public class Solution { public void reOrderArray( int [] array) { if (array.length== 1 ||array.length== 0 ) return ; merge(array); } public void merge( int [] arr) { ArrayList<Integer> left = new ArrayList(); ArrayList<Integer> right = new ArrayList(); for ( int i: arr) { if ((i& 1 )== 0 ) //偶数 { right.add(i); } else { left.add(i); } } int r = arr.length- 1 ; do { arr[r--]=right.remove(right.size()- 1 ); } while (right.size()!= 0 ); do { arr[r--]=left.remove(left.size()- 1 ); } while (left.size()!= 0 ); } } |
方法二: 插入排序法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
import java.util.ArrayList; public class Solution { public void reOrderArray( int [] array) { if (array.length== 1 ||array.length== 0 ) return ; handle(array); } public void handle( int [] arr) { for ( int i= 0 ,j;i<arr.length;++i) { if ((arr[i]& 1 )== 0 ) continue ; //arr[i] 是奇数,并且前一位是偶数 int curNode = arr[i]; for ( j=i;j> 0 &&(arr[j- 1 ]& 1 )== 0 ;) { arr[j--]=arr[j]; } arr[j]=curNode; } } } |
两种方法,看你是想要快,还是内存小