リンクリストと配列のクイックソートアルゴリズムの実装が必要なアルゴリズムの問題でした。
私は両方の部分を行っています、アルゴリズムは動作していますが、私のクイックソートリンクリストの実装にいくつかのバグがあるようです。リンクリストのクイックソートの実装が配列1よりもずっと遅いのはなぜですか?
ここは私のクイックソートリンクリストの実装です。ここで
public static void SortLinkedList(DataList items, DataList.Node low, DataList.Node high)
{
if(low != null && low !=high)
{
DataList.Node p = _PartitionLinkedList(items, low, high);
SortLinkedList(items, low, p);
SortLinkedList(items, p.Next(), null);
}
}
private static DataList.Node _PartitionLinkedList(DataList items, DataList.Node low, DataList.Node high)
{
DataList.Node pivot = low;
DataList.Node i = low;
for (DataList.Node j = i.Next(); j != high; j=j.Next())
{
if (j.Value().CompareTo(pivot.Value()) <= 0)
{
items.Swap(i.Next(),j);
i = i.Next();
}
}
items.Swap(pivot, i);
return i;
}
クイックソート配列の実装です
public static void SortData(DataArray items, int low, int high)
{
if (low < high)
{
int pi = _PartitionData(items, low, high);
SortData(items, low, pi - 1);
SortData(items, pi + 1, high);
}
}
static int _PartitionData(DataArray arr, int low, int high)
{
double pivot = arr[high];
int i = (low - 1);
for (int j = low; j <= high - 1; j++)
{
if (arr[j].CompareTo(pivot)<=0)
{
i++;
arr.Swap(i,j);
}
}
arr.Swap(i + 1, high);
return i + 1;
}
ここでクイックソート配列とリンクリストのパフォーマンスがあります。 (left n、right time)
Picture
qsリンクされたリストからわかるように、6400要素をソートするのに10分かかりました。
また、私はデータ構造のために、私は選択したソートとリンクされたリストと配列の両方のパフォーマンスが同じ構造を使用していたので、それは似ていなかったと思います。
GitHub repo私はいくつかのコードを提供するのを忘れた場合。 Repo
リンクリストの実装が遅いのは大丈夫です。なぜなら、Big-O表記の配列とリンクされたリストのランダム要素のアクセス時間は何ですか? "リンクされたリストと配列の両方のパフォーマンスは似ていました" - これはできないので、これは気になる兆候であるはずです。いずれにせよ、あなたのコードをプロファイルしてください。プロファイラは、何かが遅い理由を教えてくれるものです。 – zerkms
リンクリストの実装が非常に遅いというのは普通だと思います。リンクされたリストの場合、10分以上かかります。配列は1秒もかかりません。 – InvGhostt
"リンクリストの実装がそれほど遅いと思っています。" ---あなたのコードを分析する必要があると答えます。 Big-Oに関して、リンクされたリストと配列ベースの両方の例の実装の複雑さは何ですか?その後、再び - プロファイラ。 – zerkms