首页 > 编程知识 正文

为了实现快速排序算法,快速排序算法的原理图解

时间:2023-05-03 18:57:33 阅读:21449 作者:2387

文章目录快速排序1一次快速排序过程1.1图解1.2 C语言实现2快速排序(递归) 2.1图解3.2 C语言实现3快速排序(非递归) 3.1图解3.2 C语言实现

快速排序以数组开头为基准定义,首先从基准右边进行比较交换基准数字; 然后从标准的左边进行比较,交换标准的数字。

完成排序一次,使基准的左右分别为小于基准的数字和大于基准的数字。

然后从左右分别重新定义新的标准,继续比较排序。

继续减少比较长度,直到左右剩下一个数字,此时完成整个数组的排序。

从小到大排序时间复杂度o(nlog2n )空间复杂度o(nlog2n )、不稳定)数据跳转)一次快速排序、时间复杂度o ) n )、递归函数的时间复杂度o ) log2n )数组本身有序,时间复杂度o )

1一次快速排序的过程1.1图解1,定义作为基准的tmp,每次将下标low的值arr[low]作为基准值设定。 2、首先从下标high到下标low进行比较。 如果arr[high]大于或等于基准tmp,下标low小于下标high,则向前移动high。 arr[high]小于基准tmp时,将下标high的值arr[high]置于下标low的位置。 当下标low等于下标high时,表示下标low的右边都是大于基准tmp的数字,此时右边完成交换。 3、然后从下标的low到比较下标的high。 如果arr[low]小于或等于基准tmp,且下标的low小于下标的high,则low向后移动。 arr[low]大于基准tmp时,将下标low的值arr[low]置于下标high的位置。 当下标low等于下标high时,表示下标low的左边都是小于基准tmp的数字,此时左边完成交换。 4、然后,将基准值tmp置于下标low的位置,返回位置,完成数值交换。 此时,基准值两边都是小于或大于基准值的数字

1.2 C语言静态(int * arr,int low,int high ) /单次快速排序,时间复杂度o(n ) {int tmp=arr[low]; //如果基准值while(lowhigh )//low大于或等于high,则退出循环(while ) lowhigharr (high ) tmp ) /的最后一个high到low之间,查找小于基准值tmp的数字,然后返回上一个}else//否则,arr[high]小于基准tmp,将high值置于low位置{arr[low]=arr[high]; }while(lowhigharr[low]=tmp ) /在开头的low到high之间寻找大于基准值tmp的数字,并将其移动到后面的空位) low; 如果arr[low]在基准tmp以上,则(if ) low==high ) low和high相等的情况下,没有比基准tmp大的数字,循环) {break; }else//否则,将该位置的arr[low]大于基准tmp、low的值置于high的位置{arr[high]=arr[low]; }}arr[low]=tmp; //最后,将基准值tmp复原。 此时,基准值两边都是小于或大于基准值的数字return low; //返回基准值的位置,判断边界}

2快速排序(递归) 2.1图首先进行快速排序,接着,如果下标par (即,有基准值的下标low )的排列整体的左右两侧的数字的个数左右两侧的剩下的数字的个数大于1,则基于下标par进行新的low和hhh 完成对整个数组的排序,直到左右剩下一个数字。

3.2 C语言实现staticvoidquick(int*arr,int low,int high ) /排序边界,递归(intpar=partition(arr,low,high ); (if ) low1par )//继续排序直到左边剩下的一位数字) quick ) arr、low、par-1 (if ) parhigh-1 )//右边剩下的一位数字) quick(Arr,) }语音快速排序(int * arr,int len ) /快速排序(递归)快速) arr,0,len-1 ); 调用//接口,参数列表不同}

3快速排序(非递归) 3.1首先,创建4个整数值的数组缓冲区,使每次快速排序时新的下标low和下标high、初始化数组下标top为0。 将下标low和high放在数组的开头和末尾,即0和len-1,执行一次快速排序后,分别判断下标par,即有基准值的下标low在数组的左右两侧的数字个数,分别根据下标par判断新的low和len-1 存储到数组缓冲区后,从缓冲区依次读取新的low和high,继续左右两侧的快速排序,直到左右剩下一个数字,数组缓冲区的下标越界,表示数组整体排序完成。 创建大小为4的整数数组缓冲区

一次最多可以输入两组数据。 也就是说,一个标准左右必须存在一个以上的数字进行排序。 然后,读取数据后存储数据,就会被直接复盖。 由此,可以优先处理基准侧的数据,然后读取数据并处理相反侧的数据。

3.2采用c语言的语音快速排序(int * arr,int len ) /快速排序) intbuff(4; //一次最多可以输入两组数据。 也就是说,必须在一个基准的左侧和右侧存在一个以上的数字进行排序,然后读出数据后存储数据,就直接复盖int* stack=buff的assert(stack!=NULL; int top=0; //堆栈顶部指针,当前可以存储数据的下标int low=0; int high=len - 1; intpar=partition(arr,low,high ); wile(top=0) if ) low1par ) {堆叠[ top ]=low; 堆叠[ top ]=par-1; (if ) parhigh-1 ) {堆叠[ top ]=par 1; 堆叠[ top ]=high; }high=stack[--top]; low=stack[--top]; if(top0) {break; }par=partition(arr,low,high ); }

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