为什么我的Gnome Sort算法导致我的系统挂起?

时间:2013-03-26 07:16:34

标签: c#

这是我的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;
                } 
            }
        }
    }

2 个答案:

答案 0 :(得分:2)

您永远不会更改传入列表。所以你总是有未排序的列表

   if (comparer.Compare(x,y) > 0)
   {
        i++;
   }
   else
   {
       list[i-1] = y;
       list[i] = x;
       i--;
       if (i == 0)
           i = 1;
       stillGoing = true;
    } 

答案 1 :(得分:2)

xy变量只包含列表中数据的副本,因此交换它们不会交换列表中的项目。

如果T是值类型,则值为实际副本。如果T是引用类型,则值是对实际数据的引用的副本。

改变这个:

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

成:

list[i - 1] = y;
list[i] = x;