c++数据结构算法复习基础--12--排序算法-常见笔试面试问题

news/2024/12/22 20:28:57 标签: 排序算法, 算法, c++

1、STL里sort算法用的是什么算法>排序算法?

快速算法>排序算法
插入排序(待排序序列个数<32时,系统默认32)。
递归层数太深,转成堆排序。

#include<algorithm> //算法库,头文件

使用了快速排序:

sort原码:
在这里插入图片描述
小到大

_EXPORT_STD template <class _RanIt>
_CONSTEXPR20 void sort(const _RanIt _First, const _RanIt _Last) {
    // order [_First, _Last)
    _STD sort(_First, _Last, less<>{
   });
    

在这里插入图片描述

EXPORT_STD template <class _RanIt, class _Pr>
_CONSTEXPR20 void sort(const _RanIt _First, const _RanIt _Last, _Pr _Pred) {
    // order [_First, _Last)
    _STD _Adl_verify_range(_First, _Last);
    const auto _UFirst = _STD _Get_unwrapped(_First);
    const auto _ULast  = _STD _Get_unwrapped(_Last);
    _STD _Sort_unchecked(_UFirst, _ULast, _ULast - _UFirst, _STD _Pass_fn(_Pred));
}

使用了插入排序

在这里插入图片描述

快速排序的优化

上图可知,当区间元素个数小于等于_ISORT_MAX 时(默认是32,如下图所示),直接转成插入排序
当数据趋于有序,插入排序是效率最高的。

if (_Last - _First <= _ISORT_MAX) {
    // small
    _STD _Insertion_sort_unchecked(_First, _Last, _Pred);
    return;
}

在这里插入图片描述

使用了堆排序

在这里插入图片描述
在这里插入图片描述

2、快速排序的时间复杂度不是稳定的nlogn,最坏情况会变成n^2,怎么解决复杂度恶化问题?

1)随着快排的进行,当所需排列的队列足够小,进行快速排序。
2)找取合适的基准数,三数取中,使其逻辑上的二叉树更加平衡。

3、快速排序递归实现时,怎么解决递归层次过深的问题?

下面引用的是c++STLsort原码
多加一个参数,系统为_Ideal,初始的时候是元素的个数,
在这里插入图片描述

template <class _RanIt, class _Pr>
_CONSTEXPR20 void _Sort_unchecked(_RanIt _First, _RanIt _Last, _Iter_diff_t<_RanIt> _Ideal, _Pr _Pred) {
   
    // order [_First, _Last)

每进行一次,对_Ideal进行缩减

_Ideal = (_Ideal >> 1) + (_Ideal >> 2); // allow 1.5 log2(N) divisions

当递归到某一个层次的时候,发现_Ideal <= 0;,就可知道我们想控制的递归快排深度就已经到达了。对剩下的元素,进行想用的排序。系统原码使用的是堆排序。

 if (_Ideal <= 0) {
    // heap sort if too many divisions
     _STD _Make_heap_unchecked(_First, _Last, _Pred);
     _STD _Sort_heap_unchecked(_First, _Last, _Pred);
     return;
 }

4、递归过深会引发什么问题?

引发效率过慢,函数调用次数过多,函数开销过大
栈相对于堆很小,容易导致栈内存溢出,程序挂掉

调用一个函数需要“压”很多东西,函数执行完,又要从栈内“弹出”很多东西。一个函数的调用,包含“压”参数、压ebp、压下一行指令地址、栈帧开辟、栈帧回退、处理返回值、弹出下一行指令地址、弹出ebp等等。

5、怎么控制递归深度?如果达到递归深度了还没排完序怎么办?

如题目三,没排完,转另一个非递归的算法>排序算法

6、

【2015阿里巴巴研发工程师笔试题】个数约为50K的数列需要进行从小到大排序,数列特征是基本逆序(多数数字从大到小,个别乱序),以下哪种算法>排序算法在事先不了解数列特征的情况下性能最优。( )
A.冒泡排序
B.改进冒泡排序
C.选择排序
D.快速排序 ---- 越乱越好
E.堆排序
F.插入排序 ----- 趋于有序,这里的基本逆序,趋于n*n

7、

【2016阿里巴巴校招笔试题】现有1GB数据进行排序,计算资源只有1GB内存可用,下列排序方法中最可能出现性能问题的是()
A.堆排序
B.插入排序
C.归并排序 — 空间复杂度最大
D.快速排序
E.选择排序
F.冒泡排序

8、

【京东】假设你只有100Mb的内存,需要对1Gb的数据进行排序,最合适的算法是()
A.归并排序
B.插入排序
C.快速排序
D.冒泡排序

对于改题目具体实现:

数据量:1G == 1024M
内存:100M
数据无法一次加载到内存上,大概十一倍的。
假如数据存放于src.txt上。

1、创建11个文件,如src01.txt ,src02.txt … src11.txt
2、循环读取原始文件src.txt,每读出一个数据,轮询放入上面的十一个小文件当中。
(此时,每一个小文件存储的数据大小,不足100M)
3、分别把每一个小文件的数据,全部加载到内存上,进行排序,完成后,把排序的结果写回到相应的小文件当中。
(此时所以小文件里面的数据是有序的)
4、利用归并思想,分别循环依次读入src01.txt 和 src02.txt 的一个数据,选出小值,写入最终的src012.txt 文件中。被写入的数据,从其对应的文件读入下一个数据,循环处理,直到两个文件的数据合并完成。
(将两个小段有序的文件,合并成一个大段有序的文件)
5、src03 <=> src04 等等,依次处理直到最后一个文件

9、内排序和外排序

内排序 – 数据都在内存上。
外排序 – 内存小,数据量大, 无法一次性将数据都加载到内存上。
前面讲的排序,只有归并是外排序,其余都是内排序。

各种算法>排序算法代码

#include<iostream>
#include<stdlib.h> //包含随机数函数srand
#include<time.h> //需要用time作为随机数种子
#include<string>
#include<stack>
#include <functional>

using namespace std;

//冒泡算法>排序算法
void BubbleSort(int arr[], int size)
{
   
	for (int i = 0; i < size; i++)//趟数
	{
   
		//一趟的处理
		//进行优化,如果某趟没有进行如何的数据交换,那么说明数据已经有序
		bool flag = false;
		for (int j = 0; j < size - 1 - i; j++)
		{
   
			if (arr[j] > arr[j + 1])
			{
   
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
				flag = true;
			}

		}
		if( !flag )
		//if (flag = false)
		{
   
			//如果没有做任何的数据交换,那么说明数据已经有序了
			return;
		}
	}
}

//选择算法>排序算法
void ChoiceSort

http://www.niftyadmin.cn/n/5795814.html

相关文章

中国人工智能学会技术白皮书

中国人工智能学会的技术白皮书具有多方面的重要作用&#xff0c;是极具权威性和价值的参考资料。 看看编委会和编写组的阵容&#xff0c;还是很让人觉得靠谱的 如何下载这份资料呢&#xff1f;下面跟着步骤来吧 步骤一&#xff1a;进入中国智能学会官网。百度搜索“中国智能学…

移除链表元素(最优解)

题目来源 203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4…

【杂谈】虚拟机与EasyConnect运行巧设:Reqable助力指定应用流量专属化

场景 公司用的是EasyConnect&#xff0c;这个软件非常好用&#xff0c;也非常稳定&#xff0c;但是有个缺点&#xff0c;就是会无条件拦截本机所有流量&#xff0c;而且会加入所有运行的exe程序&#xff0c;实现流量全部走代理。 准备材料 一个windows/Linux 桌面版虚拟机Ea…

Webpack学习笔记(5)

1.拆分开发环境和生产环境配置 很多配置在开发环境和生产环境存在不一致的情况&#xff0c;比如开发环境没有必要设置缓存&#xff0c;生产环境需要设置公共路径等等。 2.公共路径 使用publicPath配置项&#xff0c;可以通过它指定应用程序中所有资源的基础路径。 webpack.…

Eureka服务注册源码

spring-cloud-starter-netflix-eureka-client 版本是3.0.3 核心装备类&#xff1a; EurekaClientAutoConfiguration EurekaDiscoveryClientConfiguration 核心类&#xff0c;以及引用的关系如下 EurekaRegistration - EurekaInstanceConfigBean 实例配置bean- ApplicationInfo…

JaxaFx学习(三)

目录&#xff1a; &#xff08;1&#xff09;JavaFx MVVM架构实现 &#xff08;2&#xff09;javaFX知识点 &#xff08;3&#xff09;JavaFx的MVC架构 &#xff08;4&#xff09;JavaFx事件处理机制 &#xff08;5&#xff09;多窗体编程 &#xff08;6&#xff09;数据…

element-puls封装表单验证

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 在做项目中会有一些简单的表单非空验证&#xff0c;这些验证比较简单&#xff0c;就是代码看着有点多&#xff0c;做起来浪费时间&#xff0c;所以我们可以将这个方法封装起来&#xff0c;然后挂载全…

【从零开始入门unity游戏开发之——C#篇23】C#面向对象继承——`as`类型转化和`is`类型检查、向上转型和向下转型、里氏替换原则(LSP)

文章目录 一、as类型转化和is类型检查1、as 关键字使用场景&#xff1a;语法&#xff1a;示例&#xff1a;特点&#xff1a; 2、is 关键字使用场景&#xff1a;语法&#xff1a;示例&#xff1a;特点&#xff1a; 3、总结 二、向上转型和向下转型1、向上转型示例&#xff1a; 2…