相同问法:给定一个数组arr,其中只可能含有0,1,2请排序
相同问法:给定一个数组arr,其中只可能含有红球、黄球、蓝球请实现红球放左边、黄球放中间、蓝球放右边
* 思路:
* 将结果分为三个区域A、B、C
* left : A区域最右端
* index : 从左到右遍历
* right : C区域最左端
* 当遍历到0时交换arr[++left]和arr[index],index++
* 当遍历到2时交换arr[--right]和arr[index],此时index不变,不能确定交换后arr[index]的值
* 当遍历到1时直接向右遍历
源代码
package com.javakk.ex;
import java.util.Arrays;
/**
* @Time 2018年8月30日 上午9:25:10
* @Title { Ex3升级 }
* @Desc { 给定一个数组arr,其中只可能含有0,1,2请排序 }
* @Desc { 给定一个数组arr,其中只可能含有红球、黄球、蓝球请实现红球放左边、黄球放中间、蓝球放右边 }
* @Email 92920@sohu.com
* @Author JavaKK
*/
public class Ex4 {
public static void main(String[] args) {
int[] arr = { 0, 1, 0, 2, 1, 0, 1, 2 };
sort(arr);
System.out.println(Arrays.toString(arr));
}
/**
* 思路:
* 将结果分为三个区域A、B、C
* left : A区域最右端
* index : 从左到右遍历
* right : C区域最左端
* 当遍历到0时交换arr[++left]和arr[index],index++
* 当遍历到2时交换arr[--right]和arr[index],此时index不变,不能确定交换后arr[index]的值
* 当遍历到1时直接向右遍历
* @param arr
*/
private static void sort(int[] arr) {
if (arr == null || arr.length == 0) {
return;
}
int left = -1;
int index = 0;
int right = arr.length;
while (index < right) {
if (arr[index] == 0) {
swap(arr, ++left, index++);
} else if (arr[index] == 2) {
swap(arr, index, --right);
}else {
index++;
}
}
}
private static void swap(int[] arr, int from, int to) {
int temp = arr[from];
arr[from] = arr[to];
arr[to] = temp;
}
}