赞
踩
目录
3.给子文件取名字 1,2,3,4,5,6,7....这样子。
1.其实外排序就是在文件中进行排序,那我们知道在文件中访问数据有很多限制,比如不可以随机访问啊,只能通过文件指针访问啊,等等。那我们为什么还要在文件中排序也就是外排序呢?
【1.】数据量过大,比如海量数据:举个例子,比如又100亿整形需要你排序,我们算一算100亿个整形放在内存中要多大空间呢。
1KB=1024byte;
1MB=1024KB:
1G=1024MB;
我们知道一个整形是4个字节,也就是4byte;
1024*1024*1024大概估计是10亿的样子,也就是说1G内存大概就只能运行10亿字节的样子。
而100亿个整形是400亿个字节,全部加载到内存中的话将需要40个G的内存,一般的电脑根本没有,就算是公司的操作系统也是要跑其他很多的程序的,这个代价显然是太大了,并且是没有的,更何况如果数据更大呢?,加内存是不能解决这类问题的。
先来一个快排:QuickSort(int* a, int left, int right):
快排写法前面总结有的,这里就不介绍了。
- void Swap(int* p1, int* p2)
- {
- int tmp = *p1;
- *p1 = *p2;
- *p2 = tmp;
- }
-
- int GetMidIndex(int* a, int begin, int end)
- {
- int mid = (begin + end) / 2;
- if (a[begin] < a[mid])
- {
- if (a[mid] < a[end])
- return mid;
- else if (a[begin] > a[end])
- return begin;
- else
- return end;
- }
- else // a[begin] > a[mid]
- {
- if (a[mid] > a[end])
- return mid;
- else if (a[begin] < a[end])
- return begin;
- else
- return end;
- }
- }
-
- void QuickSort(int* a, int left, int right)
- {
- assert(a);
- if (left >= right)
- return;
-
- int midIndex = GetMidIndex(a, left, right);
- Swap(&a[midIndex], &a[right]);
-
- int prev = left - 1;
- int cur = left;
- int keyindex = right;
-
- while (cur < right)
- {
- if (a[cur] < a[keyindex] && ++prev != cur)
- Swap(&a[prev], &a[cur]);
-
- ++cur;
- }
- Swap(&a[++prev], &a[keyindex]);
-
- int div = prev;
-
- QuickSort(a, left, div - 1);
- QuickSort(a, div + 1, right);
-
- }
我们写的是外排序嘛,那就是在文件中排序,我们先准备一个文件,里面放入100个数据,这里我们只是进行模拟,不需要真的放100亿个数据,哈哈。文件里面数据大小随便写,但是数据的格式一定要统一,不然后面文件读取不好搞了就。
这里其实有俩个步骤我们和在一起搞了。
这里我们有100个数据,我们按照10个一组的去分为是个。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。