这是我的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;
}
}
}
}
答案 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)
x
和y
变量只包含列表中数据的副本,因此交换它们不会交换列表中的项目。
如果T
是值类型,则值为实际副本。如果T
是引用类型,则值是对实际数据的引用的副本。
改变这个:
temp = x;
x = y;
y = temp;
成:
list[i - 1] = y;
list[i] = x;