快排优化:举一反三,轻松面对快排面试题

简介: 做一些学习记录

问题一:在一堆无序的数字中查找第 k 位元素

使用快速排序算法:

  • 做了大量的无用操作,这会导致算法效率很低
  • 快速排序算法的时间复杂度不稳定,很有可能退化到最坏的时间复杂度 O(n2)

问题二:有没有不需要排序,且效率更高的做法呢?

快速选择算法解决。

快速选择算法是基于快速排序算法的一种拓展算法,它可以在不对数据整体进行排序的前提下,快速找到排名第 k 位的元素,而且时间复杂度还能优化到 O(n)


问题三:在使用快排的情况下,如何才能让它的时间复杂度大概率稳定在 O(nlogn)?

  • 优化一:单边递归优化
  • void quick_sort(int *arr, int l, int r) {
  •    while (l < r) {
  •        // 进行一轮 partition 操作
  •        // 获得基准值的位置
  •        int ind = partition(arr, l, r);
  •        // 右侧正常调用递归函数
  •        quick_sort(arr, ind + 1, r);
  •        // 用本层处理左侧的排序
  •        r = ind - 1;
  •   }    
  • return ;
  • }
  • 优化二:基准值选取优化
  • 优化三:partition 操作优化

总结:快速选择算法可以用来快速查找一个序列中排名第 k 位的元素;单边递归法可以使快排过程中的递归调用次数减少一半,并且,这种优化方法也可以使用在所有和快速排序类似的程序结构中;三点取中法能帮助我们选出更加合理的基准值,保证快速排序的运行效率;优化 partition 的操作,通过减少程序实现中的比较操作,来提高程序的运行效率。


此文章为3月Day3学习笔记,内容来源于极客时间《常用算法25讲》,强烈推荐该课程!

目录
相关文章
|
5月前
|
存储 Java 开发者
面试官:小伙子知道synchronized的优化过程吗?我:嘚吧嘚吧嘚,面试官:出去!
面试官:小伙子知道synchronized的优化过程吗?我:嘚吧嘚吧嘚,面试官:出去!
69 1
|
3月前
|
Java Android开发
Android面试题经典之Glide取消加载以及线程池优化
Glide通过生命周期管理在`onStop`时暂停请求,`onDestroy`时取消请求,减少资源浪费。在`EngineJob`和`DecodeJob`中使用`cancel`方法标记任务并中断数据获取。当网络请求被取消时,`HttpUrlFetcher`的`cancel`方法设置标志,之后的数据获取会返回`null`,中断加载流程。Glide还使用定制的线程池,如AnimationExecutor、diskCacheExecutor、sourceExecutor和newUnlimitedSourceExecutor,其中某些禁止网络访问,并根据CPU核心数动态调整线程数。
111 2
|
1月前
|
存储 缓存 编解码
Android经典面试题之图片Bitmap怎么做优化
本文介绍了图片相关的内存优化方法,包括分辨率适配、图片压缩与缓存。文中详细讲解了如何根据不同分辨率放置图片资源,避免图片拉伸变形;并通过示例代码展示了使用`BitmapFactory.Options`进行图片压缩的具体步骤。此外,还介绍了Glide等第三方库如何利用LRU算法实现高效图片缓存。
57 20
Android经典面试题之图片Bitmap怎么做优化
|
3月前
|
缓存 安全 算法
Java面试题:如何通过JVM参数调整GC行为以优化应用性能?如何使用synchronized和volatile关键字解决并发问题?如何使用ConcurrentHashMap实现线程安全的缓存?
Java面试题:如何通过JVM参数调整GC行为以优化应用性能?如何使用synchronized和volatile关键字解决并发问题?如何使用ConcurrentHashMap实现线程安全的缓存?
37 0
|
1月前
|
SQL 关系型数据库 MySQL
面试官:limit 100w,10为什么慢?如何优化?
面试官:limit 100w,10为什么慢?如何优化?
138 2
面试官:limit 100w,10为什么慢?如何优化?
|
2月前
|
存储 前端开发 JavaScript
面试时让你手写一个防抖和节流优化,你能写出来吗?(二)
面试时让你手写一个防抖和节流优化,你能写出来吗?(二)
|
2月前
|
运维 监控 算法
[go 面试] 优化线上故障排查与性能问题的方法
[go 面试] 优化线上故障排查与性能问题的方法
|
3月前
|
缓存 Prometheus 监控
Java面试题:如何监控和优化JVM的内存使用?详细讲解内存调优的几种方法
Java面试题:如何监控和优化JVM的内存使用?详细讲解内存调优的几种方法
88 3
|
3月前
|
算法 Java API
Android性能优化面试题经典之ANR的分析和优化
Android ANR发生于应用无法在限定时间内响应用户输入或完成操作。主要条件包括:输入超时(5秒)、广播超时(前台10秒/后台60秒)、服务超时及ContentProvider超时。常见原因有网络、数据库、文件操作、计算任务、UI渲染、锁等待、ContentProvider和BroadcastReceiver的不当使用。分析ANR可借助logcat和traces.txt。主线程执行生命周期回调、Service、BroadcastReceiver等,避免主线程耗时操作
60 3
|
4月前
|
缓存 JSON 网络协议
Android面试题:App性能优化之电量优化和网络优化
这篇文章讨论了Android应用的电量和网络优化。电量优化涉及Doze和Standby模式,其中应用可能需要通过用户白名单或电池广播来适应限制。Battery Historian和Android Studio的Energy Profile是电量分析工具。建议减少不必要的操作,延迟非关键任务,合并网络请求。网络优化包括HTTPDNS减少DNS解析延迟,Keep-Alive复用连接,HTTP/2实现多路复用,以及使用protobuf和gzip压缩数据。其他策略如使用WebP图像格式,按网络质量提供不同分辨率的图片,以及启用HTTP缓存也是有效手段。
79 9