Quicksortを10回実行し、平均平均時間を取得します。 私はQicksort/Insertionソートの組み合わせで同じことをしていますが、クイックソートよりも遅いようです。クイックソート/挿入クイックソートだけのコンボスピードより遅い?
は、ここで私は挿入ソート
public static <T extends Comparable<? super T>> void OptQSort2 (T[] data, int min, int max) {
int indexofpartition;
if(max - min > 0) {
if((max - min) <= 10) {
// Use InsertionSort now
InsertionSort.sort(data);
return;
} else {
indexofpartition = findPartition(data, min, max);
OptQSort2(data, min, indexofpartition - 1);
OptQSort2(data, indexofpartition + 1, max);
}
}
}
と定期的なクイックソートは、ちょうど上記のスニペットと同じである呼び出すコードの一部だが、挿入ソートを呼び出す場合の条件なし。次のように
FindPartitionは次のとおりです。
public static <T extends Comparable<? super T>> int findPartition(T[] data, int min, int max) {
int left, right;
T temp, partitionelement;
int middle = (min + max)/2;
partitionelement = data[middle];
left = min;
right = max;
while(left < right) {
while(data[left].compareTo(partitionelement) <= 0 && left < right)
left++;
while(data[right].compareTo(partitionelement) > 0)
right--;
if(left < right) {
temp = data[left];
data[left] = data[right];
data[right] = temp;
}
}
(挿入ソートを使用しています)だけクイックソートとOptSort2の平均時間は
Sorted using QuickSort in: 3858841
Sorted using OptQSort2 in: 34359610
任意のアイデアなぜですか?シーケンスのサイズは重要ですか?私はこのために1000要素のInteger []配列を使用しています
'InsertionSort.sort()'は再帰的に実行する必要がありますか? –
QucikSortとInsertionSortの実装を見ることなく、それを伝えることは不可能です。 –
これは巨大で予想外の格差です。正確に 'InsertionSort.sort'は何をしますか? –