📜  DAA-快速排序

📅  最后修改于: 2021-01-12 03:40:20             🧑  作者: Mango


它是按照分而治之的原则使用的。快速排序是很多情况下的首选算法,因为它并不难实现。这是一种很好的通用排序,并且在执行过程中消耗相对较少的资源。

好处

  • 它就位,因为它仅使用一个小的辅助堆栈。

  • 仅需要n(log n)次即可对n个项目进行排序。

  • 它的内部循环极短。

  • 该算法已经过全面的数学分析,可以对性能问题做出非常精确的陈述。

缺点

  • 它是递归的。特别地,如果递归不可用,则实现极其复杂。

  • 在最坏的情况下,它需要二次(即n2)时间。

  • 它很脆弱,即实现中的一个简单错误可能会被忽略,并导致其性能下降。

快速排序的工作原理是将给定的数组A [p … r]划分为两个非空子数组A [p … q]A [q + 1 … r],这样A [p … q]小于或等于A [q + 1 … r]中的每个键。

然后,通过对Quick sort的递归调用对这两个子数组进行排序。分区的确切位置取决于给定的数组,索引q作为分区过程的一部分进行计算。

Algorithm: Quick-Sort (A, p, r) 
if p < r then 
   q Partition (A, p, r) 
   Quick-Sort (A, p, q) 
   Quick-Sort (A, q + r, r) 

请注意,要对整个数组进行排序,初始调用应为Quick-Sort(A,1,length [A])

第一步,快速排序将选择数组中的一项作为枢轴进行排序。然后,在枢轴的任一侧对数组进行分区。小于或等于枢轴的元素将向左移动,而大于或等于枢轴的元素将向右移动。

分割阵列

分区过程将就地重新排列子阵列。

Function: Partition (A, p, r) 
x ← A[p] 
i ← p-1 
j ← r+1 
while TRUE do 
   Repeat j ← j - 1 
   until A[j] ≤ x  
   Repeat i← i+1 
   until A[i] ≥ x  
   if i < j then  
      exchange A[i] ↔ A[j] 
   else  
      return j 

分析

快速排序算法的最坏情况复杂度是O(n 2 ) 。但是,使用这种技术,通常情况下,通常我们得到的输出时间为O(n log n)