快速排序算法的优化以及归并排序伪代码记录学习一个小时算法

本文介绍了一种改进的快速排序算法,通过优化三点中值法确定分区基准,结合绝对中值法和自适应策略,当列表较短时切换到插入排序。同时,展示了归并排序与快速排序的融合思想,以提升排序效率。

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

*partition2(A,p,r)
*   {
*
*      //优化三点中值法优化代码防止迭代层数过高
*      *      midIndex = p + ((r-p)>>1)//中间下表
*      *      midValueIndex=-1
*      *      if(A[p]<=A[midIndex]&&A[p]>=A[r])
*      *      {
*      *          midValueIndex=p
*      *      }
*      *      else if (A[r]<=A[midIndex]&&A[r]>=A[p])
*      *      {
*      *          midValueIndex=r
*      *      }
*      *      else {
*      *          midValueIndex=midInex
*      *      }
*      *      swap(A,midValueIndex,p) //p里面放的就是中值元素
*      pivot =A[p];
*      left = p+1;
*      right = r;
*
*      优化2 运用绝对中值法进行找到中间值
*      优化3,根据算法的复杂度进行
*      当列表足够短时用插入排序
*      if (r-p+1<=8)
*          insertSort()
*      else
*          quicksort
*
*      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;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/***
 * 归并排序的思路是重在归并,快速排序是重在划分,两者不同
 * 思路:merge排序用两个指针,和一个开辟好的额外的一莫一样数组
 * 指针进行移动比较大小值,覆盖原数组
 * mergeSort(A,p,r):
 *    if (p<r){
 *        mid = p+((r-p)>>1)划分
 *        mergeSort(A,p,mid)//解决
 *        mergeSort(A,mid+1,r)解决
 *        merge(A,p,mid,r)//归并
 *
 *    }
 * helper=[A.length]
 * merge(A,p,midIndex,r):
 *      copy(A,p,helper,p.r-p+1)
 *       left = p //左侧队伍的头部指针,指向待比较元素
 *       right= mid+1//左侧队伍的头部指针,指向待比较元素
 *       current=p//原数组指针,指向待填入的元素的位置
 *
 *       while(left<=mid&&right<=r)
 *          if (helper[left]<=helper[right])
 *          {
 *              A[current] = helper[left]
 *              current++;
 *              left++;
 *
 *          }
 *          else{
 *              A[current]=helper[right];
 *              current++;
 *              right++;
 *          }
 *          //当左侧没有比较完成
 *          while(left<=mid)
 *          {
 *             A[current] =helper[left];
 *             current++;
 *             left++;
 *          }
 *
 *
 */

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值