C#QuickSort递归程序没有排序

时间:2012-10-08 18:04:44

标签: c# wpf arrays collections quicksort

我想了解一个快速举措的例子。我随机生成9个数字并放在一个列表中。该程序选择一个随机枢轴。根据数据透视表,列表中的其他值将放入左侧列表或右侧列表中。然后我再次使用左侧列表和右侧调用该方法。这是我感到困惑的地方。它没有完全排序9个数字。我做错了什么?

这是我更新的代码。现在,如果数据透视表编号与列表中的另一个编号相同,则返回时它不会包含在已排序的列表中。未分类487878146,已分类14678 我认为导致问题的代码是(if(j == pivot)continue;)

public static List<int> QuickSort(List<int> arr)
    {
        Random random = new Random();
        int i, pivot;

        List<int> leftList = new List<int>();
        List<int> rightList = new List<int>();

        if (arr.Count > 1)
        {
            //pivot = random.Next(arr[0],arr[arr.Count - 1]);
            pivot = arr[random.Next(0, arr.Count - 1)];
                foreach(int j in arr)
                {
                    if (j == pivot) continue;
                    if (j <= pivot)
                        leftList.Add(j);
                    else
                        rightList.Add(j);
                }

            List<int> sortedLeft = QuickSort(leftList);
            List<int> sortedRight = QuickSort(rightList);

            List<int> tempList = new List<int>();
            tempList.AddRange(sortedLeft);
            tempList.Add(pivot);
            tempList.AddRange(sortedRight);

            //for (i = 1; i <= leftList.Count; i++)
            //    tempList.Add(leftList[i - 1]);
            //tempList.Add(pivot);
            //for (i = 1; i <= rightList.Count; i++)
            //    tempList.Add(rightList[i - 1]);


            return tempList;
        }
        return arr;
    }

2 个答案:

答案 0 :(得分:2)

您的快速排序会返回排序列表,因此您需要合并它们而不是未排序的输入:

List<int> sortedLeft = QuickSort(leftList);
List<int> sortedRight QuickSort(rightList);

List<int> tempList = new List<int>();
tempList.AddRange(sortedLeft);
tempList.Add(pivot);
tempList.AddRange(sortedRight);

答案 1 :(得分:0)

除了Lee的回答之外,您应该修改您的数据透视表选择,因为您使用的是不必在数组中的随机数,然后将其插入列表中。你可以尝试这样的例子:

pivot = arr[random.Next(0,arr.Length - 1)];