QuickSort算法第一个数据透视点位于数组中的最终位置后,下一步是什么?

时间:2017-02-22 13:56:52

标签: java arrays algorithm quicksort

目前我试图了解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>

4 个答案:

答案 0 :(得分:3)

以下动画表示说明了如何在数组中查找透视值。

enter image description here

数据透视值将列表分为两部分。并且递归地,我们找到每个子列表的轴,直到所有列表只包含一个元素。

实现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)的情况的数量更小。