1

これは私のGnomeソートアルゴリズムです。何らかの理由で使用すると、システムがハングします。その部分と関係があるのではないかと思いますが、comparer.Compare(x,y) == 1よくわかりません。

    static public void GnomeSort<T>(IList<T> list)
    {
        GnomeSort<T>(list, Comparer<T>.Default);
    }

    static public void GnomeSort<T>(IList<T> list, IComparer<T> comparer)
    {
        bool stillGoing = true;
        while (stillGoing)
        {
            stillGoing = false;
            for (int i = 1; i < list.Count; )
            {
                T temp;
                T x = list[i - 1];
                T y = list[i];
                if (comparer.Compare(x,y) == 1)
                    i++;
                else
                {
                    temp = x;
                    x = y;
                    y = temp;
                    i--;
                    if (i == 0)
                        i = 1;
                    stillGoing = true;
                } 
            }
        }
    }
4

2 に答える 2

2

受信リストを変更することはありません。だからあなたはいつもソートされていないリストを持っています

   if (comparer.Compare(x,y) > 0)
   {
        i++;
   }
   else
   {
       list[i-1] = y;
       list[i] = x;
       i--;
       if (i == 0)
           i = 1;
       stillGoing = true;
    } 
于 2013-03-26T07:23:25.223 に答える
2

xおよび変数にはリスト内のデータのyコピーのみが含まれるため、それらを交換してもリスト内の項目は交換されません。

が値型の場合T、値は実際のコピーです。が参照型の場合T、値は実際のデータへの参照のコピーです。

これを変える:

temp = x;
x = y;
y = temp;

の中へ:

list[i - 1] = y;
list[i] = x;
于 2013-03-26T07:23:42.767 に答える