目前我试图了解QuickSort算法在将其实现到代码之前如何运作,我有未排序的数组:
{7,8,2,5,1,9,3,6}
在这个问题的情况下,数组中最右边的元素已被选为枢轴,6。 我已经通过数组比较每个元素与6(枢轴)并依赖于数组元素是否小于或大于6,完成了相应的操作。因此,现在所有小于6的值都在左侧,所有大于6的值都在右侧 该阵列现在看起来像这样
{2,5,1,3,6,7,9,8}.
正如许多教程所述,我们现在基本上有两个较小的数组
{2,5,1,3} and {7,9,8}
我被困在这里,接下来该做什么,因为每个不同的教程选择一个不同的支点,使其难以遵循。 我在两个较小的阵列中再次做同样的事情吗?
如果有人可以告诉我如何对{2,5,3,1}
阵列进行排序并解释你是如何做到这一点那么我将会{7,9,8}
自己做。{/ p>
答案 0 :(得分:3)
以下动画表示说明了如何在数组中查找透视值。
数据透视值将列表分为两部分。并且递归地,我们找到每个子列表的轴,直到所有列表只包含一个元素。
实现QuickSort算法的步骤:
步骤1 - 选择最高索引值作为pivot(可以是任何索引)
步骤2 - 将两个变量指向列表的左右两边,不包括数据
第3步 - 左指向低指数
第4步 - 正确指向高位
步骤5 - 左边的值小于右移的枢轴
步骤6 - 右边的值大于枢轴左移
步骤7 - 如果步骤5和步骤6都不匹配左右交换
步骤8 - 如果向右≥,则他们遇到的点是新的支点
上述算法的伪代码可以推导为 -
function partitionFunc(left, right, pivot)
leftPointer = left -1
rightPointer = right
while True do
while A[++leftPointer] < pivot do
//do-nothing
end while
while rightPointer > 0 && A[--rightPointer] > pivot do
//do-nothing
end while
if leftPointer >= rightPointer
break
else
swap leftPointer,rightPointer
end if
end while
swap leftPointer,right
return leftPointer
end function
快速排序算法
递归地使用pivot算法,我们最终得到了更小的分区。然后处理每个分区以进行快速排序。我们为quicksort定义递归算法如下 -
步骤1 - 使最右侧的索引值转动
步骤2 - 使用透视值
对数组进行分区第3步 - 递归快速排序左分区
第4步 - 递归快速分配右分区
快速排序伪码
为了更多地了解它,让我们看一下快速排序算法的伪代码 -
procedure quickSort(left, right)
if right-left <= 0
return
else
pivot = A[right]
partition = partitionFunc(left, right, pivot)
quickSort(left,partition-1)
quickSort(partition+1,right)
end if
end procedure
答案 1 :(得分:1)
一旦获得第一个支点的位置,你需要在两个分段上做同样的事情。递归调用左右段的方法。
现在对您的两个子集{2,5,1,3}
和{7,9,8}
进行分区。
您将在{2,5,1,3}
上选择3作为数据透视,并为第一个分段获取{2,1}
和{5}
,并为其他分段执行类似操作。
{2,5,1,3}
^
{2,1,3,5}
^
pivot (3) at proper position. do the same on left and right segments.
{2,1} and {5}
^
{1,2,3,5}
答案 2 :(得分:1)
QuickSort的工作方式是通过递归过程,这是您描述的过程。在两个结果数组上应用相同的过程,你会没事的。
为了澄清一下,这个算法的基本情况是当输入数组的大小为1时,产生一个排序数组。
答案 3 :(得分:0)
快速回答:
我被困在这里,接下来要做什么,因为每个不同的教程选择 不同的支点让人难以理解。
可以通过多种不同方式选择枢轴,甚至可以随机选择。快速排序的平均性能是O(n * log n),但最坏情况是O(n ^ 2)。根据选择枢轴的方式,在对一些“末端”数组进行排序时算法更可靠,因此,其性能为O(n ^ 2)的情况的数量更小。