算法练习(八):三色排序问题

问题:给定一个无序数组,这个数组中只包含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;
    }
}

  

posted on 2021-08-31 17:26  yssd  阅读(253)  评论(0)    收藏  举报

导航