これはweired問題であり、私はシンプルなクイックソートを実装している。..IComparable <T>は、負の数に使用するとstackoverflowを返しますか?次のように
static void Main(string[] args)
{
List<int> unsorted = new List<int> { 1, 3, 5, 7, 9, 8, 6, 4, 2 };
List<int> sorted = quicksort(unsorted);
Console.WriteLine(string.Join(",", sorted));
Console.ReadKey();
}
private static List<T> quicksort<T>(List<T> arr) where T : IComparable<T>
{
List<T> loe = new List<T>(), gt = new List<T>();
if (arr.Count < 2)
return arr;
int pivot = arr.Count/2;
T pivot_val = arr[pivot];
arr.RemoveAt(pivot);
foreach (T i in arr)
{
if (i.CompareTo(pivot_val) <= 0)
loe.Add(i);
else
gt.Add(i);
}
List<T> resultSet = new List<T>();
resultSet.AddRange(quicksort(loe));
gt.Add(pivot_val);
resultSet.AddRange(quicksort(gt));
return resultSet;
}
出力は次のとおりです。1,2,3,4,5,6,7,8,9
しかし、私はソートされていないリスト内の任意の負の数を使用する場合、stackoverflowの誤差がある例 ため
場合は、リストに新しい=未分類リスト{1、3、5、7、9、8、6、4、2、- 1}; 今、スタックオーバーフローが発生しました。
何が起こっているのですか?なぜこれは動作していないのですか?
クイックソートアルゴリズムにエラーがあり、それを完全に踏襲した可能性は考えましたか? – asawyer
この単純なアルゴリズムの実装は正確です。実装にエラーはありません。 – Shivraj
エラーは実装されています。セット{0、-1}を実行してみてください。あなたは、戻り値が{0、-1}に等しい直前に再評価されることがわかります。 if文は毎回 '0.CompareTo(-1)= 1'です。これは、ここのドキュメントに従って正しいです:http://msdn.microsoft.com/en-us/library/y2ky8xsk.aspx – asawyer