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

经典面试排序题(快排堆排)

经典快排

#include <iostream>
#include <vector>
using namespace std;void quick_sort(vector<int> &vec, int l, int r) {if (l < r) {int i = l, j = r, x = vec[i];while (i < j) {while (i < j && vec[j] >= x) j--;if (i < j) vec[i++] = vec[j];while (i < j && vec[i] < x) i++;if (i < j) vec[j--] = vec[i];}vec[i] = x;quick_sort(vec, l, i - 1);quick_sort(vec, i + 1, r);}
}void output(vector<int> &vec) {int n = vec.size();if (n == 0) return;for (int i = 0; i < n - 1; i++)cout << vec[i] << " ";cout << vec[n - 1] << endl;
}int main()
{vector<int> vec1 = {2, 0, 1, 7, 5, 3, 4, 7, 8};quick_sort(vec1, 0, vec1.size() - 1);output(vec1);return 0;
}

经典堆排

#include <iostream>
#include <vector>
using namespace std;void adjust(vector<int> &vec, int len, int fa) {int idx = fa, ma = vec[fa];int l = fa * 2 + 1, r = fa * 2 + 2;if (l < len && vec[l] > ma) {ma = vec[l];idx = l;}if (r < len && vec[r] > ma) {ma = vec[r];idx = r;}if (idx != fa) {swap(vec[fa], vec[idx]);adjust(vec, len, idx);}
}void heap_sort(vector<int> &vec) {int n = vec.size();// 构建最大堆for (int i = n / 2 - 1; i >= 0; i--) {adjust(vec, n, i);}// 调整最大堆for (int i = n - 1; i >= 1; i--) {swap(vec[0], vec[i]);adjust(vec, i, 0);}
}void output(vector<int> &vec) {int n = vec.size();if (n == 0) return;for (int i = 0; i < n - 1; i++)cout << vec[i] << " ";cout << vec[n - 1] << endl;
}int main()
{vector<int> vec2 = {2, 0, 1, 7, 5, 3, 4, 7, 8};heap_sort(vec2);output(vec2);return 0;
}

leetcode hot100 第K大

也是常有的御用面试经典算法题。

215. 数组中的第K个最大元素

给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。

请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。

示例 1:

输入: [3,2,1,5,6,4], k = 2
输出: 5

示例 2:

输入: [3,2,3,1,2,4,5,5,6], k = 4
输出: 4

提示:

  • 1 <= k <= nums.length <= 105
  • -104 <= nums[i] <= 104

class Solution {
public:void KMax(vector<int>& nums, int l, int r, int k, int &res, bool &find) {if (find) return;int n = nums.size();int i = l, j = r, x = nums[i];if (l < r) {while(i < j) {while (i < j && nums[j] >= x) j--;if (i < j) nums[i++] = nums[j];while (i < j && nums[i] < x) i++;if (i < j) nums[j--] = nums[i];}nums[i] = x;}if (i == n - k) {find = true;res = x;} else if (i < n - k) KMax(nums, i + 1, r, k, res, find);else KMax(nums, l, i - 1, k, res, find);}int findKthLargest(vector<int>& nums, int k) {bool find = false;int res = 0;KMax(nums, 0, nums.size() - 1, k, res, find);return res;}
};

相关文章:

  • Django之五种中间件定义类型—process_request、process_view、process_response.......
  • Taro框架中的H5 模板基本搭建
  • 鸿蒙OS开发实战:【自动化测试框架】使用指南
  • 1. TypeScript: JavaScript 的超集,为大型应用而生
  • NIKKE胜利女神PC怎么设置中文 手把手教你设置中文教程
  • vivado ILA 交叉触发
  • 开源区块链系统/技术 总结(欢迎补充,最新)
  • Mysql数据库getshell方法
  • 访问网站时你的电脑都做了什么
  • 如何批量获取商品详情数据(淘宝1688京东商品采集示例)
  • 2024/4/9
  • 数据驱动决策的秘密武器:一探FineBI的核心功能
  • spikingjelly学习-训练网络
  • ssm034学生请假系统+jsp
  • 路由器拨号失败解决方法
  • 【5+】跨webview多页面 触发事件(二)
  • 【知识碎片】第三方登录弹窗效果
  • 0x05 Python数据分析,Anaconda八斩刀
  • ComponentOne 2017 V2版本正式发布
  • ES6 学习笔记(一)let,const和解构赋值
  • es的写入过程
  • golang 发送GET和POST示例
  • hadoop集群管理系统搭建规划说明
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • Javascript编码规范
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • nodejs实现webservice问题总结
  • quasar-framework cnodejs社区
  • TypeScript实现数据结构(一)栈,队列,链表
  • Vue.js-Day01
  • Zsh 开发指南(第十四篇 文件读写)
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 开发基于以太坊智能合约的DApp
  • 时间复杂度与空间复杂度分析
  • 用jQuery怎么做到前后端分离
  • # include “ “ 和 # include < >两者的区别
  • #HarmonyOS:Web组件的使用
  • #pragma data_seg 共享数据区(转)
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (20050108)又读《平凡的世界》
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (转)fock函数详解
  • (转)项目管理杂谈-我所期望的新人
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .NET 指南:抽象化实现的基类
  • .net 中viewstate的原理和使用
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • @Tag和@Operation标签失效问题。SpringDoc 2.2.0(OpenApi 3)和Spring Boot 3.1.1集成