快速排序原理和边界条件

本文详细阐述了快速排序的原理,介绍了选择不同pivot(基准值)时的分割策略,以及针对左右边界和中间点的优化方法,并点出关键的注意点以避免死循环。
摘要由CSDN通过智能技术生成


快速排序的原理

  • 选择基准值
  • 将数组分成两个子数组:小于基准值的元素和大于基准值的元素
  • 对这两个子数组进行上述步骤直到基准值
  • 注:快速排序思想类似于树的前序遍历

在这里插入图片描述

快速排序的简单优化

  • 可以通过循环先找到左边最小,再通过循环找到右边最小;然后直接将两者进行交换;交换之后直接跳过这两个元素的比较,可以减少比较步骤
  • 实测pivot 选择在端点不如在中间点或者随机点的效率高
  	int i = l - 1, j = r + 1, x = a[l + r >> 1];//l-1 和 r+1 是为了满足后面的do while
    while (i < j)
    {
        do i ++ ; while (a[i] < x);   //先跳过再判断
        do j -- ; while (a[j] > x);
        if (i < j) swap(a[i], a[j]);//如果不符合交换,下次循环先++/-- 跳过
    }

//便于理解版本
	int i = l, j = r, pivot = a[r+l>>1],flag=0;
	while(i < j)
	{
	    if(flag == 1){i++;j--;flag=0;}
			while(a[i] < pivot) i++; 
			while(a[j] > pivot) j--;
			if(i < j) {swap(a[i], a[j]);flag=1;}
	}
	**quicksort(a, l, j);
	quicksort(a, j+1, r);**

快速排序的注意点

当pivot取左边界

当pivot= a[l]时,**quicksort(a, l, j)quicksort(a, j+1, r);
// 若取quicksort(a, l, i-1),quicksort(a, i, r); i最后取值为0 
//quicksort(a, i, r); 最后会在quicksort(a, 0, 1);中死循环**

当pivot取中间点

当pivot= a[r+l>>1]时,**quicksort(a, l, j)quicksort(a, j+1, r);**
当pivot= a[r+l+1>>1]时,**quicksort(a, l, i-1)quicksort(a, i, r);**

当pivot取有边界

当pivot= a[r]时,**quicksort(a, l, i-1)quicksort(a, i, r);
// 若取quicksort(a, l, j),quicksort(a, j+1, r); j最后取值为1 
//quicksort(a, l, j); 最后会在quicksort(a, 0, 1);中死循环**
  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xの哲學

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值