C ++ quicksort练习中期帮助请

时间:2015-11-03 06:08:35

标签: c++ quicksort

我在练习中期问题中理解我的教授的快速算法算法时遇到了麻烦,并且想知道是否有人可以帮助我澄清排序是如何进行的。

Pesudocode

void Sort(int A[], int a, int b)
{
    cout << "Sorting array between index" << a << " and Index " << b << endl;
    if(a>=b) return;
    int m = Partition(A, a, b);
    Sort(A, a, m-1);
    Sort(A,m+1, b);
}
void partition(int A[], int a, int b)
{
    int v = A[b];
    int x = a-1;
    for(int y = a; y <= b-1; y++)
    {
        if(A[y] < v)
        {
            Swap(A[x+1], A[y]);
            cout << "Swapped Item " << A[x+1] << " with item " << A[y] << endl;
            x++;
        }
    }
    Swap(A[x+1],A[b]);
    cout << "Swapped item " << A[x+1] << " with item " << A[b] << endl;
    return x+1;
}


Index:   0   1   2   3
Value:   9   6   7   5
--------------------------------------------------------------------

我不知道我是否做对了,因为我很困惑&#34; y&lt; = b-1&#34;在forloop中,让我觉得&#34; y&lt; = 3-1&#34;是&#34; y&lt; = 2&#34;所以,如果它让我感到困惑,我很抱歉,我会尽力理解这个循环。

好的,当我在(int y = a; y&lt; = b-1; y ++)的分区中启动forloop时,我比较A [y]&lt; A [B]

Index:   0*  1   2   3*        
Value:   9   6   7   5

A[0] < A[3] = 9 < 7     is not true so I skip to the next element
A[1] < A[3] = 6 < 7     is true, Swap(A[x+1], A[y])

我认为x = -1,因为x = a-1 - &gt; x =低-1 - > x = 0-1 - &gt; x = -1

swap(A[x+1],A[x]) = swap(A[-1+1],A[3]) = swap(A[0], A[3])

x++ = x=0+1 = x=1

已交换:

Index:   0   1   2   3        
Value:   5   6   7   9

在那之后,我真的迷失了下一步该怎么做。我知道这是不正确的,如果有人可以帮助我完成代码,我会很感激,所以我可以更容易理解。我很感激。

还有一个与我的快速排序代码相关的练习中期问题:

e) If the above algorithm is run with the above **Partition** routine,
   a stack overflow may occur in some cases. What are these cases? 
   Briefly explain why a stack overflow may occur in these cases and modify
   the Partition routine to minimize the probability of stack overflow.

我不确定如何回答这个问题,因为我认为快速排序堆栈溢出是随着一个随机数据块发生的,或者是递归问题导致了O(n ^ 2)的最坏情况。

1 个答案:

答案 0 :(得分:1)

起始数组是

Index:   0   1   2   3
Value:   9   6   7   5

(如果你的教授选择了这个,他选择了奇怪的。)前三个值中没有一个小于最后一个,所以控制将通过for循环而不执行任何交换。

Index:   0   1   2   3
Value:   9   6   7   5

然后Swap(A[x+1],A[b]);交换第一个和最后一个元素:

Index:   0   1   2   3
Value:   5   6   7   9

并且函数返回0.数组具有以下属性:索引0到索引3的值不小于A [0],然后Sort调用

Sort(A, 0, -1);
Sort(A, 1, 3);

至于堆栈溢出,你是对的,它可能发生在接近O(n)最坏情况的情况下,这在随机数据中非常罕见,但可能发生在某种真实数据中。您已经掌握了解决该部分所需的所有信息。