【问题标题】:My program quicksort does not work我的程序快速排序不起作用
【发布时间】:2017-10-26 02:08:18
【问题描述】:

我对快速排序的实现有疑问。 问题看起来是随机的,排序后的数组永远不会排序。

我基于这个伪代码:

1 procedure quick sort1(l, r);
2 begin
3 if ` < r then
4 t ← A[l]; {t — pivot}
5 s ← l;
6 for i ← l + 1 to r do {move elements around pivot}
7 if A[i] < t then
8 s ← s + 1;
9 swap(A[s], A[i]);
10 end if;
11 end for;
12 swap(A[l], A[s]);
13 quick sort1(l, s − 1); {recursive call for both subarrays}
14 quick sort1(s + 1, r);
15 end if;
16 end.

这是我的代码:

    public void QuickSort(int[] A, int l, int r)
    {
        int t;
        int s = 0;
        if (l < r)
        {
            t = A[l];
            s = l;
            for (int i = l + 1; i < r; i++)
            {
                if (A[i] < t)
                {
                    s = s + 1;
                    swaponator(ref A[s], ref A[i]);

                }
            }
            swaponator(ref A[l], ref A[s]);
            QuickSort(A, l, s - 1);
            QuickSort(A, s + 1, r);
        }

    }

但它不起作用 - 我不知道为什么,我调试了它,但仍然没有。

请问有人可以给我小费吗?

最好的问候。

【问题讨论】:

  • 我的第一个技巧是使用有意义的变量名——否则很难阅读。
  • “不工作”是什么意思?有什么例外吗?出乎意料的结果?请更具体地说明您要实现的目标以及您遇到的具体问题。
  • 伪代码的来源是什么?我无法通过谷歌找到它。
  • @him 不工作的测试数组:new int[] { 5, 1, 4 }。排序到4, 1, 5

标签: c# algorithm quicksort


【解决方案1】:

问题出在 for 循环中。要迭代数组中的所有数字,变量 i 必须达到 r 的值。

for (int i = l + 1; i <= r; i++)

【讨论】:

  • Quicksort 的所有伪代码的问题在于,循环条件是&lt;= 还是&lt; 并不总是很清楚。请注意,给定int[] array,您必须将Quicksort 称为Quicksort(array, 0, array.Length - 1)
【解决方案2】:

如果存在重复条目,它们可能会出现问题,所以

if (A[i] <= t);

并且 r 最初应该作为 'n-1' 传递。

【讨论】:

    猜你喜欢
    • 2014-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多