public class Solution {
public void reOrderArray(int [] array) {
int k = 0;
for (int i = 0; i < array.length; i++) {
if ((array[i] & 1) == 1) {//从左向右,每次遇到的,都是最前面的奇数,一定将来要被放在k下标处
int temp = array[i];//现将当前奇数保存起来
int j = i;
while (j > k){//将该奇数之前的内容(偶数序列),整体后移一个位置
array[j] = array[j-1];
j--;
}
array[k++] = temp;//将奇数保存在它将来改在的位置,因为我们是从左往右放的,没有跨越奇 数,所以一定是相对位置不变的
}
}
}
} import java.util.Arrays;
public class Solution1 {
public void reOrderArray2(int[] array) {
int[] a = new int[array.length];
int b = 0;
for (int i = 0; i < array.length; i++) {
if (array[i] % 2 != 0) {
a[b] = array[i];
b++;
}
}
for (int i = 0; i < array.length; i++) {
if (array[i] % 2 == 0) {
a[b] = array[i];
b++;
}
}
System.out.println(Arrays.toString(a));
}
public static void main(String[] args) {
int[] arr1 = { 1, 2, 3, 4, 5, 6, 7 };
int[] arr2 = { 2, 4, 6, 1, 3, 5, 7 };
int[] arr3 = { 1, 3, 5, 7, 2, 4, 6 };
int[] arr4 = { 1 };
int[] arr5 = { 2 };
int[] arr6 = {};
Solution1 s = new Solution1();
s.reOrderArray2(arr1);
s.reOrderArray2(arr2);
s.reOrderArray2(arr3);
s.reOrderArray2(arr4);
s.reOrderArray2(arr5);
s.reOrderArray2(arr6);
}
} //权当温习一下归并排序(<=时则为稳定性排序),修改一下比较规则即可
public class Solution {
public void reOrderArray(int [] array) {
//运用归并排序
if (array == null || array.length < 1) {
return ;
}
mergeSort(array, 0, array.length - 1);
}
public void mergeSort(int[] arr, int left, int right) {
if (left >= right) {
return ;
}
int mid = (left + right) / 2;
mergeSort(arr, left, mid);
mergeSort(arr, mid + 1, right);
merge(arr, left, mid, right);
}
public void merge(int[] arr, int left, int mid, int right) {
if (left >= right) {
return ;
}
int[] temp = new int[right - left + 1];
int i = left;
int j = mid + 1;
int k = 0;
while (i <= mid && j <= right) {
if (compare(arr[i], arr[j])) {
temp[k++] = arr[i++];
} else {
temp[k++] = arr[j++];
}
}
if (i <= mid) {
for (; i <= mid; i++) {
temp[k++] = arr[i];
}
} else {
for (; j <= right; j++) {
temp[k++] = arr[j];
}
}
k = 0;
for (i = left; i <= right; i++) {
arr[i] = temp[k++];
}
}
public boolean compare(int x, int y) {
if (x % 2 == 1) {
return true;
}
if (y % 2 == 1) {
return false;
}
return true;
}
}
/**
* 解决思路:因为要求相对位置保持不变,所以不能使用指针法。
* 可以使用冒泡排序或者归并排序。
*
* @author freedom wang
* @date 2021-01-23 13:35:37
*/
public void reOrderArray(int[] array) {
if (array == null || array.length < 2) {
return;
}
for (int i = array.length - 1; i > 0; i--) {
for (int j = 0; j < i; j++) {
if ((array[j] % 2) == 0 && (array[j + 1] % 2) == 1) {
swap(array, j, j + 1);
}
}
}
}
private void swap(int[] array, int i, int j) {
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
import java.util.*;
public class Solution {
public void reOrderArray(int [] array) {
ArrayList<Integer> odd = new ArrayList<>();
ArrayList<Integer> even = new ArrayList<>();
for (int i = 0;i < array.length;i++) {
if (array[i] % 2 != 0) {
odd.add(array[i]);
}else {
even.add(array[i]);
}
}
for (int i = 0;i < odd.size();i++) {
array[i] = odd.get(i);
}
for (int j = odd.size();j < array.length;j++) {
array[j] = even.get(j-odd.size());
}
}
} public class Solution {
public void reOrderArray(int [] array) {
for(int i = 0; i < array.length;i++) {
if((array[i]&1) == 0) {
for(int j = i + 1;j < array.length;j++){
if((array[j]&1) != 0) {
swap(array,i,j);
break;
}
}
}
}
}
private void swap(int[]array,int i,int j) {
int temp = array[j];
while(j > i) {
array[j] = array[j-1];
j--;
}
array[i] = temp;
}
}
import java.util.*;
public class Solution {
public void reOrderArray(int [] array) {
for(int i= 0; i < array.length;i++){
for(int j = i; j >0; j--){
if(i>=1){
if((array[j] % 2 == 1) && array[j-1] % 2 ==0){
int temp = array[j-1];
array[j-1] = array[j];
array[j] = temp;
}
}
}
}
}
} import java.util.*;
public class Solution {
public void reOrderArray(int [] array) {
ArrayList<Integer> odd_arr = new ArrayList();
ArrayList<Integer> even_arr = new ArrayList();
for(int p:array){
if(p % 2 ==1){
odd_arr.add(p);
}
else{
even_arr.add(p);
}
}
odd_arr.addAll(even_arr);
for(int i =0; i < array.length; i++){
array[i] = odd_arr.get(i);
}
} public class Solution {
public void reOrderArray(int [] array) {
int[]ou=new int[array.length];
int[]ji=new int[array.length];
int a=0;
int b=0;
for(int i=0;i<array.length;i++){
if(array[i]%2==0){
ou[a]=array[i];
a++;
}else{
ji[b]=array[i];
b++;
}
}
for(int j=0;j<b;j++){
array[j]=ji[j];
}
for(int j=0;j<a;j++){
array[b+j]=ou[j];
}
}
} public class Solution {
public void reOrderArray(int [] array) {
int mid=0;//作为第一个偶数的分割点
while(mid<array.length && (array[mid] & 1) ==1){
mid++;
}
int cur=mid+1;//既然退出循环,说明这个值就是偶数,记得别用mid++,因为用了之后mid也会+1
while(cur<array.length){
if((array[cur] & 1) ==0){//如果是偶数,则不用操作
cur++;
}else{//如果是奇数,则需要将它向前移动到mid的位置,而mid位置到这个数的位置的值全部向后移动
int num=array[cur];
int index=cur-1;
while(index+1<array.length && index>=mid){
array[index+1]=array[index];
index--;
}
array[mid]=num;
cur++;
mid++;
}
}
}
}
public class Solution {
public void reOrderArray(int [] array) {
for(int i=1;i<array.length;i++){
if(array[i]%2!=0){
for(int j=i;j>0;j--){
if(array[j-1]%2!=0) {break;}
else {
int temp=array[j-1];
array[j-1]=array[j];
array[j]=temp;
}}
}
}
}
}
碰到奇数与前面一个一个对比交换知道碰到前面的是偶数为止 public class Solution {
public void reOrderArray(int [] array) {
int n = array.length;
int[] res = new int[n];
int ji=0;
int ou = n-1;
for(int i=0;i<n;i++){
if(array[i]%2==1) res[ji++] = array[i];
if(array[n-i-1]%2==0) res[ou--] = array[n-i-1];
}
for(int i=0;i<n;i++){
array[i] = res[i];
}
}
} /**
题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,
所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
题解:
要保证原有的次序,则只能顺次移动或者是相邻交换
i 从左向右开始遍历,找到第一个偶数
j 从 i+1 开始遍历,知道找到第一个奇数
将 i,……,j-1 的元素整体后移一位,最后将找到的奇数放入 i 位置中, 然后再 i++
*/
public void reOrderArray(int [] array) {
int i = 0, j = 1, len = array.length;
int temp;
while (true) {
// 左指针 i 找到第一个 偶数
while (i < len && array[i] % 2 == 1) {
i ++;
}
// 右指针 j 找到第一个 奇数
j = i + 1;
while (j < len && array[j] % 2 == 0) {
j++;
}
if (j >= len) {
// 终止条件
break;
}
// 将 i,……,j-1 的元素整体后移一位,最后将找到的奇数放入 i 位置中,
temp = array[j];
for (int k = j - 1; k >= i; k--) {
array[k + 1] = array[k];
}
array[i] = temp;
// 更新 i 值
i++;
}
} public class Solution {
public void reOrderArray(int [] array) {
int write = 0;
for (int read = 0; read < array.length; read++){
if ((array[read]&1) == 1){
int tmp = array[read];
for (int i = read-1; i >= write; i--){
array[i+1] = array[i];
}
array[write] = tmp;
write += 1;
}
}
}
} public static void reOrderArray(int [] array) {
int[] res = new int[array.length];
int n = 0;
for(int i = 0;i<array.length;i++){
if((array[i]%2)==1){
res[n++]=array[i];
}
}
for(int i = 0;i<array.length;i++){
if((array[i]%2)==0){
res[n++]=array[i];
}
}
System.arraycopy(res, 0, array, 0, res.length);
} 新建一个数组,遍历原数组依次选出奇数放入新数组,再次遍历选出偶数依次放入,然后将新数组赋值给原数组public void reOrderArray(int [] array) {
//使用队列方便后面取数据
Queue<Integer> even = new LinkedList();
int i = 0;
for (int n = 0; n < array.length; n++){
if((array[n] & 1) == 1){
//奇数部分直接加入原数组
array[i++] = array[n];
}else{
//偶数部分最后加
even.add(array[n]);
}
}
while(!even.isEmpty()){
array[i++] = even.poll();
}
}
public class Solution {
public void reOrderArray(int [] array) {
int start=0;
int tmp=0;
for(int i=0;i<array.length;i++)
{
if(array[i]%2==1)
{
tmp=array[i];
for(int j=i-1;j>=start;j--)
array[j+1]=array[j];
array[start]=tmp;
start++;
}
}
}
}
/** * 1.要想保证原有次序,则只能顺次移动或相邻交换。 * 2.i从左向右遍历,找到第一个偶数。 * 3.j从i+1开始向后找,直到找到第一个奇数。 * 4.将[i,...,j-1]的元素整体后移一位,最后将找到的奇数放入i位置,然后i++。 * 5.終止條件:j向後遍歷查找失敗。 */ public void reOrderArray2(int [] a) { if(a==null||a.length==0) return; int i = 0,j; while(i<a.length){ while(i<a.length&&!isEven(a[i])) i++; j = i+1; while(j<a.length&&isEven(a[j])) j++; if(j<a.length){ int tmp = a[j]; for (int j2 = j-1; j2 >=i; j2--) { a[j2+1] = a[j2]; } a[i++] = tmp; }else{// 查找失敗 break; } } } boolean isEven(int n){ if(n%2==0) return true; return false; }