排序分为两种,分别是内排序和外排序:
内部排序:数据元素全部放到内存中的排序。
外部排序:数据元素太多不能同时放在内存中,根据排序的过程不能在内外存之间移动数据的排序。
外存就是硬盘的意思:
我们对外部排序进行解释:
例如,假如我们有2g的数据,我们只有1g的内存,那我们要要进行存储数据的话,我们的内存不能够承载这2g的数据,所以我们就要引入外排序。

对于这些常见的排序算法,也只有归并排序既能够内排序,又能够外排序。
因为我们要访问硬盘数据时,是不能够随机访问数据的,而上面的排序要么就是要随机访问,要么就是要进行交换,都不支持外部排序。
我们如何用归并排序进行外部排序呢?
我们画图来进行解释:

我们首先让1g内存先处理2g数据的前一半数据,把前一段数据处理成为有序的
再用1g内存处理2g数据的后一半数据,把后一段数据处理成为有序的。

我们再把这两个数据分开,我们可以通过双指针的方法来操作:

我们判断begin1和begin2下标对应的数据的大小,把小的数据逐渐放回到2g的数据中去,当begin1和begin2其中一个走向end时
我们再把剩下的一个的所有数据再拷贝到2g的数据中,进而实现用1g的内存排序2g的数据。
第一串代码:
打印hello world
- #include<iostream>
- using namespace std;
- int main()
- {
- cout << "hello world" << endl;
- return 0;
- }
我们也可以这样写:
- #include<iostream>
- int main()
- {
- std::cout << "hello world"<<std::endl;
- return 0;
- }
我们进行编译:

我们先写一串代码进行分析:
- #include
- int rand = 0;
- int main()
- {
- printf("%d\n", rand);
- }
这串代码打印的结果是什么?
答:很简单,因为我们的rand是全局变量,全局变量的作用域是全局的,所以我们的打印函数是能够打印出rand对应的值的。

但是假如我们再加入一个头文件呢?
- #include
- #include
- int rand = 0;
- int main()
- {
- printf("%d\n", rand);
- }
我们再进行编译:

我们思考:代码报错的原因是什么?
答:原因是出在头文件#include

rand在该头文件中是一个函数,该函数的作用是产生随机数。
所以:这里就产生分歧了,我们要打印的是全局变量rand还是#include
编译器无法区分,所以就报错了。
我们如何解决这个问题:
答:我们可以采取封装的方式:
我们可以使用命名空间来进行隔离:
- #include
- #include
- namespace bit
- {
- int rand = 0;
- }
- int main()
- {
- printf("%d\n", rand);
- }
这里可以形象化描述为这样:命名空间bit是一个围墙,rand是一个苹果,当我们不使用命名空间bit进行封装时,我们是可以找到苹果的,但是假如我们使用命名空间bit时,就表示我们把围墙后放置了一个苹果,我们不越过围墙的话,是不能够看到苹果的。
我们进行编译检测:

这个是对应的函数编号,我们不做考虑。
我们可以使用命名空间域的方式来访问命名空间内部的内容:
- #include
- #include
- namespace bit
- {
- int rand = 0;
- }
- int main()
- {
- printf("%d\n", rand);
- printf("%d\n", bit::rand);
- }
我们进行编译:

我们在一些c++代码中总会看到开头的这样一串代码:
using namespace std;
std是c++标准库文件,假如我们要使用c++的语言,我们就要用使用这串代码,这串代码的意思就是解封标准库文件:我们能够自由使用c++标准库里面的内容
当我们使用了该代码,我们的打印hello bit是这样写的。
- #include<iostream>
- using namespace std;
- int main()
- {
- cout << "hello bit" << endl;
- return 0;
- }
我们进行编译:

当我们不使用using namespace std时。
我们就需要使用命名空间域的方法:
-
- #include<iostream>
- //using namespace std;
- int main()
- {
- std::cout << "hello bit" << std::endl;
- return 0;
- }
我们进行编译:

这里的符号<<其实可以理解为流向的意思。
![]()
这里表示字符串hello bit流向了对象cout中
后面的endl是endline的意思,就是换行的意思。
这串代码相对于c语言的有点就是它可以自动识别类型。
- #include<iostream>
- //using namespace std;
- int main()
- {
- /*std::cout << "hello bit" << std::endl;*/
- int a = 10;
- double b = 10.11;
- printf("%d %.2f\n", a, b);
- std::cout << a << " " << b << std::endl;
- return 0;
- }
我们进行编译:

我们使用c语言的方式打印时,还需要加上%d %lf等符号,但是用c++可以自动识别参数的类型并打印。