-2

ソートされていない配列と整数 k の場合、k 以下のすべての要素が k より大きい要素の前に来るように、配列内の要素を再配置するメソッドを作成します。

ここに私のコードがあり、動作しません

public class SmallerFirst
{
    public int[] sort(int[] a, int k) 
    {

        if(a.length == 1)
        {
            return a;
        }

        if(a.length == 0)
        {
            return a;
        }

        else
        {
            int last = (a.length-1);
            for(int pos=0; pos<a.length; pos++)
            {
                for(int x=1;x>0;x++)
                {
                    if(last == 0)
                    {
                        break;
                    }
                    if(a[pos] > k)
                    {
                        swap(a,pos,last); last--; continue;
                    }           
                    else
                    {
                        break;
                    }
                }       
            }
            return a;
        }
    }

    public void swap(int[] a,int p1,int p2)
    {
        int temp = 0;
        temp = a[p2];
        a[p2] = a [p1];
        a[p1]=temp;
    }

}
4

3 に答える 3

0

k 以下のすべての要素が k より大きい要素の前に来るように、配列内の要素を再配置します。

  • この問題では、配列をソートする必要はありません
  • Arrays.sort()便利ですが、不必要にO(n)問題を問題にO(nlogn)変えます
  • 簡単な解決策は、 time:O(n)と spaceO(n)です。つまり、入力配列と同じサイズの空の配列を準備し、入力配列をループしますelement <= k。 .
  • O(n)ただし、時間と空間によって行うことができますがO(1)(場所を移動して)、次のような結果が得られる場合があります。

( はa配列int[]になり、kk問題の です )

    int p = -1; // flag pointer
    int w = 0; // working pointer

    for (; w <= a.length - 1; w++) {
        if (a[w] <= k) {
            p++;
            if (w != p) {
                swap(a, p, w);
            }
        }
    }
于 2013-10-03T15:51:42.537 に答える
0

これはあなたが望むことをするはずです

public static void sort(int[] a, int k) {
    if(a.length > 1) {
        int last = (a.length-1),
            first = 0;
        while(last > first) {
            if(a[first] <= k) first++;
            else if(a[last] > k) last--;
            else swap(a, first, last);
        }
    }
}
于 2013-10-03T15:22:06.377 に答える