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 回答