算法练习(八):三色排序问题
问题:给定一个无序数组,这个数组中只包含0,1,2三种数字,对这个数组进行排序。
解题思路:
要充分利用题给的条件:只含有0或1或2
可以这样想:0应该往前放,1应该不变,2应该往后扔。
定义三个变量begin指向首下标,end指向尾下标,current最开始指向首下标。
- 当current对应数组值是0的时候,跟begin去交换,然后begin++,current++,这样能保证0往前调。
- 当current对应数组值是1的时候,current++
- 当current对应数组值2的时候,应该与end与交换,因为2在数组中的位置是靠后的,此外,current++,end–
package Algriothm;
public class ThreeColor {
public static void main(String[] args) {
int[] arr = {0, 1, 2, 0, 1, 2, 2, 1, 0};
int begin = 0;
int current = 0;
int end = arr.length - 1;
// 其实使用到了数据交换的功能
// 当前数据等于0时,默认往数组的前面存放
// 当前数据等于1时,暂时不动,并记录1的位置,也就是begin的位置
// 当前数据等于2时,放置到数组的后面存放
while (current <= end) {
if (arr[current] == 0) {
swap(arr, begin, current);
current++;
begin++;
} else if (arr[current] == 1) {
current++;
} else {
swap(arr, current, end);
end--;
}
}
}
public static void swap(int arr[], int a, int b) {
int tmp = arr[a];
arr[a] = arr[b];
arr[b] = tmp;
}
}
浙公网安备 33010602011771号