关于快速排序的三种划分元素的方法

本文详细介绍了快速排序的三种实现方式:单向扫描、双向扫描和三指针法,分别通过伪代码演示了如何利用这些方法划分和合并数组。适合理解排序算法的深入剖析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路和伪代码如下:需要的小伙伴们自己实现
/****
 * 分治思想:划分子问题再合并
 * 快排的重点是划分,归并的重点是合并
 * 快速排序:1,分解,解决,合并
 * 一遍单向扫描法:
 * 定主元,两个指针,一个是sp后面扫,另一个b指针
 * 小于等于 sp右移,大于的bigger左移关键找出分
 *  伪代码如下
 *  quickSort(A,p,r)
 *     if (p<r)
 *          q= partition(A,p,r)
 *          quickSort(A,p,q-1)
 *          quickSort(A,q+1,r)
 *  paraition(A,p,r)
 *      p = A[p]
 *      scanner =p+1
 *      int bigger =r;
 *      while(scanner<=bigger):
 *          if(A[scanner]<p):
 *              scanner++;
 *          else
 *              swap(A,sanner,bigger)
 *              bigger--
 *      swap(A,p,bigger)
 *      return bigger
 *
 */
/*****
 *  分割元素的另一种是双向扫描法
 * 思路:左右指针一起移动,left遇到第一大于主元的
 * 停止,right遇到第一个小于主元的停止,两者进行
 * 交换再次移动。直到边界处,rigth小于left,然后把
 * right和主元位置互换
 * 伪代码:
 * partition(A,p,r)
 * {
 *     int pivote = A[p]
 *     int r =A.length-1
 *     left=p
 *     right = r
 *     while(left<=right)
 *          if A[left]<=pivote && A[right]>pivote
 *              left++;
 *              right--;
 *          else if A[left]<=pivote && A[right]<pivote
 *              left++;
 *          else if
 *              right --
 *          swap(A,left,right)
 *          left++;
 *          right--
 *     swap(A,p,right)
 *     return right
 *   // 伪代码2
 *   partition2(A,p,r)
 *   {
 *      pivot =A[p];
 *      left = p+1;
 *      right = r;
 *
 *      while(left<=right)
 *      {
 *      //left 不停往右走,直到遇到大于主元的的元素停下
 *      while(left<=right&&A[left]<=pivot) left++;//循环退出时,left一定是第一个大于主元位置,防止一直往前冲越界
 *      while(left<=right&&A[right]>pivot) right--;//循环退出时,right一定是最后一个小于等于主元位置
 *      if (left<right) // 防止交换出现问题
          swap(A,left,right)
 *      }
 *      //while退出时,两者交错,right应该是最后一个小于等于主元位置,是主元应该待的位置
 *      swap(A,p,right);
 *      return right;
 *
 *   }
/**
*快速排序三指针法用于数组中和主元重复过多的排序
* 思路:三个指针一个是scanner,一个是equal,一个是bigger
* 小于主元,s和e的位置交换,e++,s++
* 等于主元 s++
* 大于主元,s和bigger交换,bigger--
* 边界考虑是s和bigger交错,
* 结尾是e--, e和p交换,返回的区间是[e,b]区间,e永远指向第一个
* 等于主元位置,b指向最后一个等于主元位置
*然后进行迭代求 (l-q1-1) q2 (q2+1,r)
* 伪代码如下:
* int [] partition(A,p,r)
*      pivot = A[p]
*      sp = p+1
*      e=p
*      bigger=r
*      while(sp<=bigger)
*          if (A[sp]<pivot)
*              swap(A,sp,e)
*              e++;
*              sp++;
*          else if (A[sp]==pivot)
*              sp++
*          else
*              swap(A,sp,bigger)
*              bigger--
*      e--
*      swap(A,e,sp)
*      return [e,b]
*
*
*
*/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值