快排算法,一文快速掌握~

大家好,我是柒星

今天我们一起探讨算法中的快速排序!

快速排序(有时称为分区交换排序)是一种有效的 排序算法,用作系统的方法用于放置的元件随机访问 文件或一个阵列中的顺序。

以下文章来源于公众号【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)之间

快速排序,你了解了吗?

发布了30 篇原创文章 · 获赞 16 · 访问量 3107

猜你喜欢

转载自blog.csdn.net/weixin_43729943/article/details/103792133