C++ 排序算法面试题

1. 常见排序算法的时间复杂度是多少?

答案:

2. 快速排序的原理和实现?

答案:

  • 原理分治算法选择基准元素(pivot)将小于pivot的放左边,大于的放右边递归处理左右两部分
  • 实现
int partition(vector<int>& arr, int low, int high) {    int pivot = arr[high];    int i = low - 1;    for (int j = low; j < high; j++) {        if (arr[j] < pivot) {            i++;            swap(arr[i], arr[j]);        }    }    swap(arr[i + 1], arr[high]);    return i + 1;}​void quickSort(vector<int>& arr, int low, int high) {    if (low < high) {        int pi = partition(arr, low, high);        quickSort(arr, low, pi - 1);        quickSort(arr, pi + 1, high);    }}
  • 优化三数取中选择pivot小数组使用插入排序尾递归优化
  • 特点不稳定排序原地排序实际应用中最快

3. 归并排序的原理和实现?

答案:

  • 原理分治算法将数组分成两半递归排序两半合并两个有序数组
  • 实现
void merge(vector<int>& arr, int l, int m, int r) {    vector<int> left(arr.begin() + l, arr.begin() + m + 1);    vector<int> right(arr.begin() + m + 1, arr.begin() + r + 1);        int i = 0, j = 0, k = l;    while (i < left.size() && j < right.size()) {        if (left[i] <= right[j]) {            arr[k++] = left[i++];        } else {            arr[k++] = right[j++];        }    }    while (i < left.size()) arr[k++] = left[i++];    while (j < right.size()) arr[k++] = right[j++];}​void mergeSort(vector<int>& arr, int l, int r) {    if (l < r) {        int m = l + (r - l) / 2;        mergeSort(arr, l, m);        mergeSort(arr, m + 1, r);        merge(arr, l, m, r);    }}
  • 特点稳定排序需要额外空间O(n)适合链表排序

4. 堆排序的原理和实现?

答案:

  • 原理建立大顶堆将堆顶(最大值)与末尾交换调整堆,重复上述步骤
  • 实现
void heapify(vector<int>& arr, int n, int i) {    int largest = i;    int left = 2 * i + 1;    int right = 2 * i + 2;        if (left < n && arr[left] > arr[largest])        largest = left;    if (right < n && arr[right] > arr[largest])        largest = right;        if (largest != i) {        swap(arr[i], arr[largest]);        heapify(arr, n, largest);    }}​void heapSort(vector<

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

C++ 常考面试题总结 文章被收录于专栏

本专栏系统梳理C++方向, 大中厂高频高频面试考点 , 内容皆来自真实面试经历,从基础语法、内存管理、STL与设计模式,到操作系统与项目实战,结合真实面试题深度解析,帮助开发者高效查漏补缺,提升技术理解与面试通过率,打造扎实的C++工程能力.

全部评论

相关推荐

01-30 16:31
已编辑
北京工商大学 Java
1.拷打项目支付成功,支付宝送来的回调丢了怎么办&nbsp;。通过mq延迟消息轮询支付宝保证,后面反思了下其实可以拓展说下多次轮询失败如何处理。支付服务的幂等性如何保证,为什么不能通过加锁。&nbsp;支付收单是一个异步的过程,不好加锁,如果加锁的话,不知道什么时候适合释放,如果用户选择一个微信支付,但是觉得选错了,要打开支付宝支付,就会发现锁没有释放,会影响用户体验。我们现在通过退款去做这个事情,如果用户支付两次,对第二次进行退款,如果两个回调同时到了,出现并发问题,我们通过乐观锁去保证并发不出现冲突。我们的设计其实是参考了美团和拼多多做的。加锁的化,你会怎么加,答:数据库行锁/redis分布式锁。&nbsp;问到redis分布式锁原理,没答上来分库分表怎么做的,面试官没有深问。2.kafka和rocketmq的区别,适用场景。rocketmq比较适合重业务的场景,Kafka因为sendfile的原因,吞吐量大,适合做日志处理,rocketmq有很多功能,比如说延迟消息,顺序消费,是Kafka没有的。我听一些之前在大厂工作过的同事说过,kafka经常被魔改,会有时间轮算法去做实现延迟消息,我认为如果在基建完善的地方,我这个项目是可以替换成Kafka的。3.mysql遇到慢sql怎么解决,比如说一个sql涉及5张表,怎么处理。我没回答上来。4.mysql索引类型。主族索引,非主族索引。&nbsp;非主族索引包括哪些?比如unique&nbsp;key&nbsp;,联合索引。什么情况会用到联合索引?有时候避免回表可能会用到。什么情况会导致联合索引失效?比如没有遵循最左匹配,或者是用了个函数。5.rocketmq事务消息怎么做的?producer先给broker发送一条半消息,然后producer执行本地操作,成功后提交消息给broker,然后broker再去投递消息。什么情况会用到事务消息?一般是在涉及到两个不同的系统中会用到,比如说我们支付服务,在支付成功后要给上游系统发一条mq的消息通知,这个时候就可以用事务消息,事务消息可以规避分布式事务。6.springboot启动流程。只说了一个读取META-INF的配置信息,其他的没说上。7.反问:什么业务?电商。电商的话怎么做的分账?通过微信支付或者是宝付。自己相比于一年前进步了很多是事实,但是大二上浪费太多时间,也缺乏面试经验。比如面试的适合我就经常发现自己表述并不清楚。目前打算面几家中厂攒攒经验,开学之后看看八股,刷leetcode,准备冲大厂,我的问题主要在于八股看的太少了,之前一直都在上班导致的,实战经验可能相对来讲丰富一点,很多内容由于之前工作没有接触过,我也就没有了解,这是我的问题。
点赞 评论 收藏
分享
评论
1
5
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务