数组排序 —— 快排算法思想应用(三色排序)

本文介绍了一种针对包含0、1、2三个数字的数组进行原地排序的方法,该方法类似于快速排序,但仅通过一次遍历实现排序,具有O(n)的时间复杂度和O(1)的空间复杂度。

三色排序

有一个只由0,1,2三种元素构成的整数数组,请使用交换、原地排序而不是使用计数进行排序。给定一个只含0,1,2的整数数组A及它的大小,请返回排序后的数组。保证数组大小小于等于500。

测试样例: [0,1,1,0,2,2],6
返回:[0,0,1,1,2,2]


解题思路

时间复杂度为O(n),空间复杂度为O(1)
1. 类似快排的取中间值,把数值1当做中间值,进行一一对比
2. 数值等于0的放1的左边,等于2的放1的右边


import java.util.*;

public class ThreeColor {

    // 数据交换
    public void swap(int[] A, int a, int b){
        int temp = A[a];
        A[a] = A[b];
        A[b] = temp;
    }
    // 三色排序,类似快排的获得中间值;
    public int[] sortThreeColor(int[] A, int n) {
        if (A == null || A.length < 1 || n < 1)
            return A;

        int index = 0;
        int left = 0;
        int right = n-1;
        while (index <= right){
            if (A[index] == 0){ 
                // index加一,因为左边交换过来的值都是排序过的,无需对比
                swap(A, index++, left++);   
            }
            else if (A[index] == 2){
                // index不加一,是因为右边的交换过来的值没排序过,还需再对比
                swap(A, index, right--);
            }
            else{
                index++;
            }
        }
        return A;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值