5.荷兰旗问题(Rainbow sort)

题目

5.png

给定一个数组{-1,1,0,-1,0,1} 数组中只有确定的3种重复元素-1,0,1,设计一个算法将其排列成{-1,-1,0,0,1,1}。

解题思路

这种荷兰期问题的核心解法很简单:ijk,ijk,ijk重要的事情说三次,为什么是ijk呢,因为解这种问题需要定义3个指针配合运算,
[0,i)i左边的元素都是-1,
[i,j)中间的元素都是0,
(k, arr.length-1] k右边的元素的都是1,
比较简单就不多做分析了,直接上代码。

Code

public class RainbowSortTest {

    @Test
    public void test() throws Exception {
        int[] arr = new int[]{1, -1, 0, 1, -1, 0};
        rainbowSort(arr);
        System.out.println(Arrays.toString(arr));
    }

    public int[] rainbowSort(int[] arr) {
        if (arr == null || arr.length <= 1) {
            return arr;
        }
        int i = 0, j = 0, k = arr.length - 1;
        while (j <= k) {
            if (arr[j] == -1) {
                swap2(arr, i, j);
                i++;
                j++;
            } else if (arr[j] == 0) {
                j++;
            } else if (arr[j] == 1) {
                swap2(arr, j, k);
                k--;
            }
        }
        return arr;
    }

    //交换数组的元素 实现2,在函数调用次数巨大的情况下可以提高一些效率
    private void swap2(int[] arr, int index1, int index2) {
        if (index1 == index2) return;
        arr[index1] = arr[index1] + arr[index2];
        arr[index2] = arr[index1] - arr[index2];
        arr[index1] = arr[index1] - arr[index2];
    }
    //交换数组的元素
    private void swap1(int[] arr, int index1, int index2) {
        int temp = arr[index1];
        arr[index1] = arr[index2];
        arr[index2] = temp;
    }
}

时空复杂度

一个循环无嵌套,时间复杂度O(n),没有使用多余的数组或递归空间复杂度O(1).

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 4,042评论 0 2
  • 0、算法概述 0.1 算法分类 十种常见排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对...
    Demon_code阅读 1,115评论 0 2
  • 排序算法说明 (1)排序的定义:对一序列对象根据某个关键字进行排序; 输入:n个数:a1,a2,a3,…,an 输...
    code武阅读 750评论 0 0
  • 第四天 数组【悟空教程】 第04天 Java基础 第1章数组 1.1数组概念 软件的基本功能是处理数据,而在处理数...
    Java帮帮阅读 1,681评论 0 9
  • 老师要大家写一篇高水平的作文参加比赛。好傢伙!我们班上突然冒出来许多优秀作文,一篇比一篇好。看着那些优秀作文,我的...
    黄奕章一阅读 213评论 1 5

友情链接更多精彩内容