1、1000w个整数(没有重复)进行排序,可用内存只有1M,怎么排序?
1000w *4 /(1024*1024)= 38.14 M ;
所以划分40个通道,每次读取25w个数据(需要不到1M内存),利用快速排序或者堆排序进行排序,然后写回到文件中;
对得到的40个排好序的文件两两进行归并排序,直到得到一个排好序的文件即可。
2、1000w个整数(没有重复)进行排序,内存不限,怎么排序?
用位图排序(C语言代码如下)
1.#include <stdio.h>
2.#include <stdlib.h>
3.#define BITSPERWORD 32 //int类型32位
4.#define SHIFT 5
5.#define MASK 0x1F //掩码,用来和i求与
6.#define N 10000000
7.int a[1 + N/BITSPERWORD]; //数组a中每个元素有32位,可以用来存储32个元素
8.
9.void set(int i) { a[i>>SHIFT] |= (1<<(i & MASK)); } //设置某位是为1或者0
10.void clr(int i) { a[i>>SHIFT] &= ~(1<<(i & MASK)); } //将该位清0
11.int test(int i){return a[i>>SHIFT] & (1<<(i & MASK)); } //返回某位的值
12.
13.int main()
14.{ int i = 0, top = 1 + N/BITSPERWORD;
15. memset(a, 0, sizeof(a)*sizeof(int));
16. while (scanf("%d", &i) != EOF) set(i);
17. for (i = 0; i < N; i++)
18. if (test(i)) printf("%d\n", i);
19. return 0;
20.}
3、C++中bitset位操作符介绍
bitset基本操作如下:
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <bitset>
using namespace std;
int main()
{
bitset<10> b; //b有10位,每位都为0
cout<<b<<endl;
for (int i=0;i<10;i++)
{
if (i%2==0)
{
b.set(i); //设置b的某一位为1
}
}
cout<<b<<endl;
b.reset(); //全部置0
b.set(); //全部置1
cout<<b<<endl;
cout<<b.test(5)<<endl; //第5位是否为1
cout<<b.any()<<endl; //b中是否存在置为1的二进制位
cout<<b.none()<<endl; //b中是否不存在置为1的二进制位
cout<<b.count()<<endl; //b中置为1的二进制位个数
return 0;
}
4、利用bitset重写位图排序代码
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <bitset>
using namespace std;
#define N 100000000 //最多N个数
bitset<N> b; //b有N个位
int main()
{
int i;
while(cin>>i)
{
b.set(i); //将该位设置为1
}
for(i=0;i<N;i++)
{
if(b.test(i)) //输出位为1对应的数值
cout<<i<<" ";
}
cout<<endl;
b.reset(); //将b所有位重置为0
return 0;
}