簡體   English   中英

如何更有效地編寫此算法

[英]How to write this algorithm more efficiently

我有一個作業,必須編寫一個將數組“拆分”為兩個的算法。 左側應為奇數,右側應為偶數。 雙方應按升序排序。 我不允許使用臨時數組或現有的api。

我設法制定了一種可行的方法,問題是說有100000個整數,大約需要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
        }
    }

感謝所有我能得到的幫助!

更好的解決方案是:

  • 首先,保留兩個指向數組的第一個和最后一個元素的變量,例如x=0; y=N-1 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(nlogn)優於O(n^2) ,這是您的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM