0

バブルソートを使用してリストをソートする関数を2つ作成しましたが、ソートスタイルをクイックソートに変更したいと考えています。

このクイックソートアルゴリズムを見つけました

http://snipd.net/quicksort-in-c

これらは私の2つの機能です:

    protected void sort_by_section_name()
    {
        int num1, num2;
        for (var i = section_names.Count - 1; i > 0; i -= 1)
        {
            for (var j = 0; j < i; j += 1)
            {
                num1 = get_number_from_section(section_names[j]);
                num2 = get_number_from_section(section_names[j + 1]);
                if (num1 > num2)
                {
                    swap_list_strings(section_names, j, j + 1);
                    swap_object_items(item_group_list, j, j + 1);
                }
            }
        }
    }

    protected void sort_items()
    {
        int num1, num2;
        List<SPListItem> temp;
        for (var k = 0; k < item_group_list.Count; k += 1)
        {
            temp = (List<SPListItem>)item_group_list[k];
            for (var i = temp.Count - 1; i > 0; i -= 1)
            {
                for (var j = 0; j < i; j += 1)
                {
                    num1 = Convert.ToInt32((temp[j])[ORDER_BY_COLUMN]);
                    num2 = Convert.ToInt32((temp[j + 1])[ORDER_BY_COLUMN]);
                    if (num1 > num2)
                    {
                        swap_list_items(temp, j, j + 1);
                    }
                }
            }
        }
    }

sort_items の場合、配列の配列なので、バブル ソートは for ループにあります。

これら 2 つの関数をクイックソートを使用するように変更する方法がわかりません。

誰か助けてくれませんか?

4

2 に答える 2

3

.NET で自分で記述する必要はありません。次のものを使用できます。

  1. 項目の基本的な配列のArray.Sort
  2. LINQ -たとえばOrderByList<string> (クラスの上部で System.Linq を使用していることを確認してください)
  3. 冒険好きなら、IComparableを調べてみてください
  4. それらを所定の位置に並べ替える myItems.Sort() を使用します。

必要に応じて、開始する最も簡単な方法は #2 を使用することです。以下に例を示します。

List<SPListItem> myItems = GetSomeItems();
myItems = myItems.OrderBy(i => i["MyField"]).ToList();

foreach (var item in sortedItems)
    Console.WriteLine(item);

あなたが求めているフィールドを知らなくても、または少し推測であるSharepointオブジェクトについて多くを知らなくても、同等のインターフェースを使用して.NETでそれを行う約5つの異なる方法があります(詳細はこちら)。SPListItem クラスを変更することはできないため、Sort または LINQ がおそらく最も簡単です。

于 2012-08-23T19:19:39.917 に答える
2

したがってList<SPListItem>、あるフィールドの数値に基づいて効率的なソート アルゴリズム (バブル ソートではない) を使用して、それらをソートする必要があります。これは簡単で、クイックソートを再実装する必要はありません。

List<SPListItem> list = ...;

var sortedData = list.OrderBy(item => Convert.ToInt32(item["fieldName"]));

可能であれば、通常は Web サーバーではなくデータベースでデータを並べ替える方がよいことにも注意してください。これらの s を Order By生成する CAML クエリに句を追加して、並べ替えを実行できるようにする必要があります。SPListItem

「並列」である 2 つの異なるデータ構造を並べ替えているようです (両方の構造の同じインデックスにある項目が一緒に「属している」)。これは一般に望ましくありません。両方の構造で並べ替えを実行する方法はありますが、実際に行うべきことは、各項目がその 1 つの項目を論理的に表すすべてのものを保持するように単一の構造を作成することです。多くの場合、これはclass各データのプロパティを持つ new を作成することを意味します。次に、この新しい複合クラスのコレクションを作成して並べ替えることができます。

于 2012-08-23T19:22:13.147 に答える