一开始想着暴力,后来才发现那个就是插入排序的思想,后来用归并排序给做出来了,下面是我的代码和别人的解法
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;
}
}
}
|
两种方法,看你是想要快,还是内存小