次の方法で配列をソートする必要がある演習があります。
- 4 を割った余りがない数が配列の最初になります (例: 4,8,12,16)。
- 4 を 1 で割った数は、配列の 2 番目 (1,5,9) になります。
- 4 を 2 で割った数は、配列の 3 番目 (2,6,10) になります。
- 4 を 3 で割る数は、配列の最後になります。
たとえば、次の配列です。
int []a={1,7,3,2,4,1,8,14}
になります:
4 8 1 1 2 14 3 7
グループ内の順序は重要ではありません。
O(n) の時間の複雑さと O(1) の空間の複雑さで機能するソリューションを見つけました。
しかし、それは醜く、配列上を 3 回移動します。よりエレガントなソリューションが必要です。
これは私のコードです:
int ptr=a.length-1; int temp=0, i=0;
while (i<ptr){
//move 3 remained to the end
if (a[i] % 4==3){
temp=a[ptr];
a[ptr]=a[i];
a[i]=temp;
ptr--;
}
else
i++;
}
i=0;
while (i<ptr){
if (a[i]%4==2)
{
temp=a[ptr];
a[ptr]=a[i];
a[i]=temp;
ptr--;
}
else
i++;
}
i=0;
while (i<ptr){
if (a[i]%4==1)
{
temp=a[ptr];
a[ptr]=a[i];
a[i]=temp;
ptr--;
}
else
i++;
}
知っておくべき重要事項:
- 時間の複雑さを O(n) よりも悪くしたくないし、空間の複雑さを O(1) よりも悪くしたくありません。