首页 > 编程知识 正文

快速排序算法的原理图解,快速排序法怎么排

时间:2023-05-06 03:58:35 阅读:21422 作者:1688

快速排序是对气泡排序的改进,基本思想是将按一次排序排序的数据分成两个独立的部分,用这种方法分别快速排序两部分数据,递归地进行整个排序过程,从而使整个数据有序

实现原理及过程(含图解)例如,对数据“8、9、1、3、5、2、7和6”进行排序。 首先,自由地将一个数作为参照数称为支点,设法将小于支点的数向左堆积,大于支点的数向右堆积,分为两部分,用于剩下的两侧

首先,选择支点,用I指数组的最左边,用j指数组的最右边。 要使支点左侧小于5,右侧大于5,请向右移动I进行比较,使左侧小于支点,右侧大于支点,直到I和j交叉偏移。 (

I和j在移动中与支点相比,a[ i ]大于支点、a[ j ]小于支点时,两者进行更换。 否则,I,j继续移动。

)例如,如果a[0]首先大于5,则I先停止移动,由于a[ j ]大于5,所以j向左移动,如果在a[5]时小于支点,则a[0]和a[5]的值被交换,然后I、j被剥离)

第一次更换后:

循环上述步骤直到错开

最终偏移时:

到此为止,a[0]到a [ j ]的数量都在5以下,a[ i ]到a [7]的数量都在5以上。 完成第一步后,接下来分别向左和向右快速排序即可。

因此,可以递归地进行。 因此,我们将研究递归出口条件。

也就是说,数组第一个元素的下标j,左边需要快速排序;

即数组最后一个要素的下标I,右边需要快速排序;

代码: # includeiostreamusingnamespacestd; voidquicksort(inta[],int left,int right ) {int i,j,point,t; point=a [ (左光线)/2]; i=left; j=right; while(I=j )/I和j没有偏移则继续循环) while(pointa[I] ) I; }while(pointa[j] ) j----; (if ) I=j ) ) {t=a[i]; a[i]=a[j]; a[j]=t; I; j----; }if(leftj ) quicksort(a ) a,left,j ); if(Iright ) quicksort(a ) a,I,right; (} int main ) ) inta(8)、9、1、4、3、5、7、6 )、I; i=8; 快速排序(a,0,i-1 ); for(I=0; i8; I ) couta[i]endl; 返回0; )时间复杂度(o ) O(NlogN )快速排序与冒泡排序相比,每次更换都具有飞跃性。 每次排序时设定支点,将支点以下的数量配置在支点的左侧,支点以上的数量配置在支点的右侧。 这样,每次更换时只能像气泡排序那样在相邻的数量之间进行更换,更换距离要大得多。 因此,总的比较和更换次数减少,速度自然加快。 当然最坏的情况是,相邻的两个数可能被交换了。 因此,快速排序的最差时间复杂度和冒泡排序是相同的o(n2 ),但平均时间复杂度是o ) O(NlogN )。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。