[英]Can anyone help tell me why my MergeSort won't sort a list?
有一些問題讓我的Merge Sort工作。 如果有人可以幫助我,我會很感激。
我不知道為什么,但排序中出現的列表沒有排序。 我嘗試過使用斷點,但這似乎沒有幫助找到問題。
static class MergeSort
{
//Sort<T> - The <T> is called a generic parameter
public static IList<T> Sort<T>(IList<T> input)
{
List<T> Result = new List<T>();
Queue<T> Left = new Queue<T>(); //Switched from lists to queues because removing at index 0 is more efficient
Queue<T> Right = new Queue<T>();
//Dequeue() and Count() have a time complexity of O(1)
if (input.Count <= 1)
return input;
int midpoint = input.Count / 2;
for (int i = 0; i < midpoint; i++)
Left.Enqueue(input[i]);
for (int i = midpoint; i < input.Count; i++)
Right.Enqueue(input[i]);
Left = new Queue<T>(Sort(Left.ToList())); //Recursion! :o
Right = new Queue<T>(Sort(Right.ToList())); ; //This line and the one above split the list into smaller lists (left and right)
Result = Merge(Left, Right); //This joins the lists together
return Result;
}
private static List<T> Merge<T>(Queue<T> Left, Queue<T> Right)
{
List<T> Result = new List<T>();
while (Left.Count /* O(1) operation */ > 0 && Right.Count > 0)
{
int cmp = Comparison((Left.Peek() as Entity), (Right.Peek() as Entity));
//If cmp is less than 0, left is less. If it is greater, left is greater
if (cmp < 0)
Result.Add(Left.Dequeue());
//Left.RemoveAt(0) - Using a list to remove at a certain point is inefficient
else
Result.Add(Right.Dequeue());
}
while (Left.Count > 0)
Result.Add(Left.Dequeue());
while (Right.Count > 0)
Result.Add(Right.Dequeue());
return Result;
}
private static int Comparison(Entity Left, Entity Right)
{
if (Left.TimesEaten > Right.TimesEaten)
{
return 1;
}
else
{
return -1;
}
}
}
如果您需要知道,在“比較”方法中,Left.TimesEaten是一個整數。
您在Merge
實施中有一個錯誤。 對於給定的Left
和Right
隊列,您只是比較它們的第一個元素。 實際上,您需要在每次添加后重新執行比較(例如,通過在循環中移動Comparison
調用):
private static List<T> Merge<T>(Queue<T> Left, Queue<T> Right)
{
List<T> Result = new List<T>();
while (Left.Count > 0 && Right.Count > 0)
{
int cmp = Comparison((Left.Peek() as Entity), (Right.Peek() as Entity));
//If cmp is less than 0, left is less. If it is greater, left is greater
if (cmp < 0)
Result.Add(Left.Dequeue());
else
Result.Add(Right.Dequeue());
}
// ...
這條線
int cmp = Comparison((Left.Peek() as Entity), (Right.Peek() as Entity));
必須在while循環中。 整個合並使用來自相同比較的結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.