快速排序是对气泡排序的改进,基本思想是将按一次排序排序的数据分成两个独立的部分,用这种方法分别快速排序两部分数据,递归地进行整个排序过程,从而使整个数据有序
实现原理及过程(含图解)例如,对数据“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 )。