数据结构论坛

首页 » 分类 » 常识 » 数据结构与算法第八节快速排序
TUhjnbcbe - 2021/1/8 14:43:00
蛇盘疮好了神经痛偏方 http://www.sharenf.com/srzz/6352.html

快速排序图解:

算法分析:

从数组中找到一个元素,称为“支点”(pivot),对数据进行排序,所有元素比支点值小的摆放在支点前面,所有元素比支点值大的摆在支点的后面。经过以上排序,这个支点就处于数组的中间位置,这个就是分区(partition)操作;

分区一次只能固定一个数值,需要把小于支点的子区和大于支点的子区再进行分区,依次递归(recursive)下去,直到左右不能再分。

图解分析:

①:双路遍历,i负责跑的快的一路,j负责跑的快的一路,最开始的时候,i和j从同一起跑线开始。R是最右边的下标,P作为选中的支点,也就是a[R]。

②:只有当a小于P支点时,停下来和此刻a[j]点发生互换,然后j++,控制j向后移动,否则只有i++向后移动。

③:i遍历的时候边界是iR,如果到达边界,说明支点P完成左右分区,当前j点就是一个定点,需要将a[R]和a[j]调换一下位置。(P就是a[R])

支点分区实现:

//定义一个使用支点分区的函数partitionintpartition(inta[],intL,intR){//定义一个支点,作为标杆参照intpivot=a[R];//定义双路游标,i跑的快负责找小于支点的值,j跑的慢负责找大于支点的值intj=L;//i和j都从同一起跑线开始for(inti=L;iR;i++){if(apivot){//i遇到大与支点的值就跳过,j遇到大于支点的值就停下,由此i和j发生错位,当遇到小于支点的值的时候a和a[j]发生互换,把小值前置,大值后移,j++inttemp=a[j];a[j]=a;a=temp;j++;//调换完成后,j向后推进继续找大值}}//遍历完成后j停留在比支点大的位置,完成分区只需要让a[R]和a[j]发生互换inttemp=a[j];a[j]=a[R];a[R]=temp;returnj;//返回支点坐标}

递归实现左右子区分区:

//定义快速排序函数voidquicksort(inta[],intL,intR){if(LR){//当左右没有碰撞的时候,才会出现左右分区intM=partition(a,L,R);//返回支点标杆//根据支点标杆再继续递归分区quicksort(a,L,M-1);//左子区再分区quicksort(a,M+1,R);//右子区再分区}}

主函数程序实现:

intmain(){inta[]={11,8,3,9,7,1,2,5};quicksort(a,0,7);for(inti=0;i8;i++){couta"";}}一只小跃跃

1