当前位置: 首页 > news >正文

在做题中学习(77):快排

解法:快排

思路:

1.快排排一趟,递归分出来的左区间和右区间(一趟的思想,看我的前一个文章:颜色分类题解)

2.递归:想清楚 函数头 和 返回条件怎么写

        函数头:把递归想成一个黑盒,默认它一定能完成任务,函数头就是nums,l,r 意思是在nums数组中的[l,r]区间排好序。

        返回条件:l >=r  ,l == r证明递归到只剩 1个元素,l > r证明递归到空,都不用进一步排序。

3.优化:等概率的取区间内任意元素为key,复杂度渐进式最低,详情看算法导论

4.解惑:为什么一定要颜色分类的思想解决快排的一趟? 

        因为如果只把数组分为两部分,比如下图:

随机的基准值元素如何取?

顺便分析:时间复杂度

完整代码:

class Solution {
public:vector<int> sortArray(vector<int>& nums) {srand(time(NULL));qsort(nums,0,nums.size()-1);return nums;}//快排void qsort(vector<int>& nums,int l,int r) //参数的意思,完成[l,r]这个区间数据的快速排序{if(l >= r) return;int key = GetRandnum(nums,l,r);int left = l-1,right = r+1;//一趟快排for(int i = l;i<nums.size();) //注意i的初始化{if(nums[i] < key)swap(nums[++left],nums[i++]);else if(nums[i] == key)i++;else if(nums[i] > key){if(right == i) break;swap(nums[--right],nums[i]);}}//分完一次,递归[l,left] key [right,r]qsort(nums,l,left);qsort(nums,right,r);}int GetRandnum(vector<int>& nums,int l,int r){int randnum = rand();return nums[(randnum % (r - l + 1)) + l];}
};


http://www.mrgr.cn/news/79379.html

相关文章:

  • 设置笔记本同时连接内外网
  • C++ 运算符重载 (备查)
  • 国科大智能设备安全-APK逆向分析实验
  • MySQL常用运维操作(二):grant赋权语句
  • CT中的2D、MPR、VR渲染、高级临床功能
  • 【Sentinel Go】新手指南、流量控制、熔断降级和并发隔离控制
  • 万物可爬(以爬取浏览器井盖图片和豆瓣电影名字为例)
  • Next.js 系统性教学:构建应用的路由与页面管理
  • jeecg-uniapp 跨域问题解决方法记录
  • Let up bring up a linux.part2 [十一]
  • Codeforces Round 991 (Div. 3) F. Maximum modulo equality(区间gcd模板)
  • 《单片机原理及接口技术》(C51编程)(第三版)------张毅刚主编
  • Java线程的interrupt中断、wait-notify/all(源码级分析)
  • 容器第四天(day041)
  • 计算机网络复习6——应用层
  • MicroBlaze软核开发(二):GPIO
  • 【AI系统】Auto-Tuning 原理
  • Vue智慧商城项目
  • 【k8s实践】 创建第一个Pod(Nginx)
  • 写NFC标签支持Android安卓Ohos纯血鸿蒙唤醒微信小程序
  • java面向对象实验——扫雷+24点
  • windsurf简介
  • [软件工程]九.可依赖系统(Dependable Systems)
  • 多层感知机imdb情感分析分块第一部分
  • 大型网站演化实例
  • Java---每日小题