【问题标题】:Stack OverFlow Exception in Quicksort Algorithm快速排序算法中的堆栈溢出异常
【发布时间】:2015-07-12 05:06:36
【问题描述】:

我在尝试对没有重复项且几乎已排序(只有 5 个数字要排序)的相对较大的列表进行排序时,我的快速排序算法出现问题。

请在下面找到代码。

 public static void MyQuickSort(List<int> list, int left, int right)
    {
        if (list == null || list.Count <= 1)
            return;

        if (left < right)
        {
            int pivotIdx = MyPartition(list, left, right);
            //Console.WriteLine("MQS " + left + " " + right);
            //DumpList(list);
            MyQuickSort(list, left, pivotIdx - 1);
            MyQuickSort(list, pivotIdx, right);
        }
    }

static int MyPartition(List<int> list, int left, int right)
    {
        int start = left;
        int pivot = list[start];
        left++;
        right--;

        while (true)
        {
            while (left <= right && list[left] <= pivot)
                left++;

            while (left <= right && list[right] > pivot)
                right--;

            if (left > right)
            {
                list[start] = list[left - 1];
                list[left - 1] = pivot;

                return left;
            }


            int temp = list[left];
            list[left] = list[right];
            list[right] = temp;

        }
    }

【问题讨论】:

  • 你调试你的代码看看会发生什么?你在哪一行得到这个异常?
  • 是的,在对列表进行分区时会发生这种情况...此外,当输入包含重复项且没有按顺序排列的随机数的列表时,它可以正常工作。
  • Phil,数据的类型将决定递归调用的次数。

标签: c# algorithm sorting exception stack


【解决方案1】:

递归算法在学术练习中很有趣,但在实践中却很少使用,因为您所看到的:太多的递归调用会导致调用堆栈的过度使用,最终由于堆栈溢出而终止。

简答:用更小的数据集试试你的代码。

长答案:重新编写代码以避免递归。您可以使用自己的堆栈代替程序的调用堆栈。

【讨论】: