[英]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
檢查的所有數字都是甚至直到第一個奇數,您都會發現!!!) 然后,您的數組的右數為偶數,左數為奇數,但未排序。 因此,您可以在上述過程中計算奇數和偶數,以便知道在數組中分隔的位置(假設在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.