大家好,我是柒星
今天我们一起探讨算法中的快速排序!
快速排序(有时称为分区交换排序)是一种有效的 排序算法,用作系统的方法用于放置的元件随机访问 文件或一个阵列中的顺序。
以下文章来源于公众号【Honker】,公众号内可查看更多算法知识,有免费学习资料领取哦~
快速排序基于分而治之的方法,该方法基于以下思想:选择一个元素作为枢轴元素并对数组进行分区,这样:枢轴的左侧包含所有小于枢轴元素的元素,右侧包含所有大于枢轴的元素
它降低了空间复杂性,并消除了在合并排序中使用的辅助数组的使用。在大多数情况下,选择数组中的随机枢轴会改善时间复杂度。
实现方式:
首先选择数组的第一个元素作为枢轴元素,我们将看到数组的分割是如何围绕枢轴发生。
在以下实现中,使用了以下组件:在这里
A[] 是要对其元素进行排序的数组
start:数组的最左边位置
end: 数组的最右边位置
i : 小于枢轴的元素与大于枢轴的元素之间的边界
j : 数组的分区和未分区部分之间的边界
piv : 枢轴元素
从数组中选择一个元素,称为数据透视
int partition ( int A[],int start ,int end) {
int i = start + 1;
int piv = A[start] ; //使第一个元素作为透视元素
for(int j =start + 1; j <= end ; j++ ) {
/*重新排列数组,将小于枢轴的元素放在另一侧,而元素大于枢轴的放于另一侧*/
if ( A[ j ] < piv) {
swap (A[ i ],A [ j ]);
i += 1;
}
}
swap ( A[ start ] ,A[ i-1 ] ) ; //将透视元素放在适当的位置
return i-1; //返回枢轴的位置
}
现在,让我们看看递归函数Quick_sort:
void quick_sort ( int A[ ] ,int start , int end ) {
if( start < end ) {
//存储数据透视元素的位置
int piv_pos = partition (A,start , end ) ;
quick_sort (A,start , piv_pos -1); //对枢轴的左侧进行排序
quick_sort ( A,piv_pos +1 , end) ; //对枢轴的右侧进行排序
}
}
在这里,我们通过使用分区功能重新排列数组来找到枢轴元素的正确位置。然后,将数组分为两个部分,即枢轴的左侧(小于枢轴元素的元素)和枢轴的右侧(大于枢轴元素的元素),并递归应用相同的步骤。
示例:有一个数组 A = {7,4,9,8,5,6,2}在下图中观察到
让我们看看分区函数的随机版本:
int rand_partition ( int A[ ] , int start , int end ) {
//使用 rand() 函数随机选择枢轴的位置
int random = start + rand( )%(end-start +1 ) ;
swap ( A[random] , A[start]) ; //使用第一个元素交换透视
return partition(A,start ,end) ; //调用上述分区函数
}
使用rand() 函数和partition()函数可以减少此算法的时间复杂度
复杂度该算法最差的时间复杂度是O(N^2) ,但是由于这是随机算法,因此其时间复杂度在 O(N^2)和 O(NlogN)之间
快速排序,你了解了吗?