我在练习中期问题中理解我的教授的快速算法算法时遇到了麻烦,并且想知道是否有人可以帮助我澄清排序是如何进行的。
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)的最坏情况。
答案 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)最坏情况的情况下,这在随机数据中非常罕见,但可能发生在某种真实数据中。您已经掌握了解决该部分所需的所有信息。