如何更有效地编写此算法

时间:2017-09-19 21:32:17

标签: java algorithm

我有一项任务,我必须编写一个算法,分析'两个数组。左侧应为奇数,右侧应为偶数。双方应按升序排序。我不允许使用临时数组或现有的api。

我已经设法制作了一个工作方法,问题是一个说100 000整数的数组,完成大约需要15秒。要求是0.1秒,所以我显然有很多需要改进的地方。我不是在寻找一个能给我答案的人,只是在正确的方向上轻推。请不要为我写任何工作代码,但我想知道我写的东西是否以及为什么不好!

到目前为止我所拥有的:

public static void delsortering(int[] a){           

        int oddnum = 0;
        int n = a.length;

        for(int k : a){ //finds how many odd numbers there are
            if((k & 1) != 0) oddnum++;
        }

        for(int i = 0; i < n; i++){ 
            if((a[i] & 1) != 0){ //finds odd numbers
                for(int j = 0; j < n; j++){
                    if((a[j] & 1) == 0) //looks for even numbers to change pos with
                        switch(a, j, i);
                }
            }
        }

        for (int i = 0; i < n; i++){ 
            int from = i < oddnum ? 0 : oddnum;
            int to = i < oddnum ? oddnum - i: n - i + oddetall;
            int m   = maxValue(a, from, to); //finds max value in specified range
            switch(a, m, to - 1); //puts said max value at specified index
        }
    }

感谢我能得到的所有帮助!

1 个答案:

答案 0 :(得分:3)

更好的解决方案是:

  • 首先保留两个指向数组的第一个和最后一个元素的变量,例如x=0; y=N-1
  • 然后开始向右移动x,直到找到偶数(所有数字,直到现在是奇数 !!!),然后开始向y移动到左边直到你找到一个奇数(所有你检查的数字,而减少左移y 甚至,直到你找到的第一个奇数!!!)
  • 交换值x,y,增加x,y并重复相同的步骤,直到x,y越过

然后你有一个右边的数字和左边的奇数,但没有订购。因此,您可以在上述过程中计算赔率和平均数,以便知道数组中分隔的位置,让我们在k索引中说出来。

  • Sort array[0 - k], Sort array[k+1 - N]

复杂性: O(n)第一部分(x,y只移动一次)和O(nlogn)两种排序O(nlogn)优于O(n^2),这是您的解决方案。