快速排序是一种高效的排序算法,它基于将数据数组划分为较小的数组。将一个大数组分为两个数组,其中一个数组的值小于指定值(如 pivot),基于该数组进行分区,另一个数组的值大于该pivot值。
快速排序对数组进行分区,然后递归调用两次以对两个输出子数组进行排序,该算法对于大型数据集非常有效,因为其平均和最坏情况下的复杂度为Ο(n 2 ),其中 n 是项数。
快速排序分区
下面的动画表示法说明了如何在数组中查找pivot值。

pivot值将列表分为两部分。递归地我们找到每个子列表的pivot,直到所有列表仅包含一个元素。
快速排序Pivot伪代码
上面算法的伪代码可以推导为-
function partitionFunc(left, right, pivot)
leftPointer = left
rightPointer = right - 1
while True do
while A[++leftPointer] < pivot do
//do-nothing
end while
</span><span class="kwd">while</span><span class="pln"> rightPointer </span><span class="pun">></span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="pun">&&</span><span class="pln"> A</span><span class="pun">[--</span><span class="pln">rightPointer</span><span class="pun">]</span><span class="pln"> </span><span class="pun">></span><span class="pln"> pivot </span><span class="kwd">do</span><span class="pln">
</span><span class="com">//do-nothing </span><span class="pln">
</span><span class="kwd">end</span><span class="pln"> </span><span class="kwd">while</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> leftPointer </span><span class="pun">>=</span><span class="pln"> rightPointer
</span><span class="kwd">break</span><span class="pln">
</span><span class="kwd">else</span><span class="pln">
swap leftPointer</span><span class="pun">,</span><span class="pln">rightPointer
</span><span class="kwd">end</span><span class="pln"> </span><span class="kwd">if</span><span class="pln">
end while
swap leftPointer,right
return leftPointer
end function
快速排序伪代码
要了解更多信息,请参阅快速排序算法的伪代码-
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 ifend procedure
C进行快速排序实现
#include <stdio.h>
#include <stdbool.h>
#define MAX 7
int intArray[MAX] = {4,6,3,2,1,9,7};
void printline(int count) {
int i;
for(i = 0;i < count-1;i++) {
printf("=");
}
printf("=\n");
}
void display() {
int i;
printf("[");
// navigate through all items
for(i = 0;i < MAX;i++) {
printf("%d ",intArray[i]);
}
printf("]\n");
}
void swap(int num1, int num2) {
int temp = intArray[num1];
intArray[num1] = intArray[num2];
intArray[num2] = temp;
}
int partition(int left, int right, int pivot) {
int leftPointer = left -1;
int rightPointer = right;
while(true) {
while(intArray[++leftPointer] < pivot) {
//do nothing
}
</span><span class="kwd">while</span><span class="pun">(</span><span class="pln">rightPointer </span><span class="pun">></span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="pun">&&</span><span class="pln"> intArray</span><span class="pun">[--</span><span class="pln">rightPointer</span><span class="pun">]</span><span class="pln"> </span><span class="pun">></span><span class="pln"> pivot</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="com">//do nothing</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">if</span><span class="pun">(</span><span class="pln">leftPointer </span><span class="pun">>=</span><span class="pln"> rightPointer</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
printf</span><span class="pun">(</span><span class="str">" item swapped :%d,%d\n"</span><span class="pun">,</span><span class="pln"> intArray</span><span class="pun">[</span><span class="pln">leftPointer</span><span class="pun">],</span><span class="pln">intArray</span><span class="pun">[</span><span class="pln">rightPointer</span><span class="pun">]);</span><span class="pln">
swap</span><span class="pun">(</span><span class="pln">leftPointer</span><span class="pun">,</span><span class="pln">rightPointer</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
}
printf(" pivot swapped :%d,%d\n", intArray[leftPointer],intArray[right]);
swap(leftPointer,right);
printf("Updated Array: ");
display();
return leftPointer;
}
void quickSort(int left, int right) {
if(right-left <= 0) {
return;
} else {
int pivot = intArray[right];
int partitionPoint = partition(left, right, pivot);
quickSort(left,partitionPoint-1);
quickSort(partitionPoint+1,right);
}
}
int main() {
printf("Input Array: ");
display();
printline(50);
quickSort(0,MAX-1);
printf("Output Array: ");
display();
printline(50);
}
Input Array: [4 6 3 2 1 9 7 ] ================================================== pivot swapped :9,7 Updated Array: [4 6 3 2 1 7 9 ] pivot swapped :4,1 Updated Array: [1 6 3 2 4 7 9 ] item swapped :6,2 pivot swapped :6,4 Updated Array: [1 2 3 4 6 7 9 ] pivot swapped :3,3 Updated Array: [1 2 3 4 6 7 9 ] Output Array: [1 2 3 4 6 7 9 ] ==================================================