これは厄介な問題です。次のように簡単なクイックソートを実装しました..
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 }; 今、スタックオーバーフローがあります..
どうしたの?なぜこれが機能しないのですか?