1

ナイーブクイックソートでは、すべてのキーがピボット値の前または後に分割されるため、一意のキーを含まない配列をソートするのにO(n ^ 2)時間がかかります。重複キーを処理する方法があります(クイックソートで説明されているものは最適です)。提案されたソリューションはHoareパーティションに対してのみ機能しますが、私はLomutoパーティションを実装しました。重複キーを処理するために、ピボットの左側に重複を移動することと、ピボットの右側に重複を移動することを交互に行いました。アルゴリズムは次のように機能します。

//partition array from index start to end
select pivot element and move it to array[start]
boolean dupHandler=true;
int index=start;
for(i from start+1 to end)
     int val=array[start].compareTo(array[i]);
     if(val==0)
          if(dupHandler)
               swap array[++index] and array[i]
          dupHandler=!dupHandler;
     else if(val>0)
          swap array[++index] and array[i]
swap array[start] and array[index]

重複キーを処理するためのより良い(より効率的な)方法はありますか?

編集:私のコード(示されているように)は、compareToがequalsと一致している必要があります(それが要件ではないとしても)

4

0 に答える 0