排序具有1Gbyte大小(每个单词255个字符)和2G RAM的字典的最佳方法是什么? 我已经尝试过快速排序,但没有得到可接受的结果。 这是快速排序代码:
#include <iostream>
#include <fstream>
#include <cstring>
#define MAXL 4000000
using namespace std;
void swap(char *&ch1,char *&ch2)
{
char *temp = ch1;
ch1 = ch2;
ch2 = temp;
}
int partition (char **arr, int low, int high)
{
string pivot = arr[high]; // pivot
int i = (low - 1); // Index of smaller element
for (int j = low; j <= high- 1; j++)
{
// If current element is smaller than or
// equal to pivot
if (arr[j] <= pivot)
{
i++; // increment index of smaller element
swap(arr[i], arr[j]);
}
}
swap(arr[i + 1], arr[high]);
return (i + 1);
}
void quickSort(char **arr, int low, int high)
{
if (low < high)
{
int pi = partition(arr, low, high);
// Separately sort elements before
// partition and after partition
quickSort(arr, low, pi - 1);
quickSort(arr, pi + 1, high);
}
}
int main()
{
fstream file("input.txt",ios::in|ios::out|ios::app);
fstream o("output.txt",ios::out);
char **arr = new char*[MAXL];
for(int i=0;i<MAXL;i++)
arr[i] = new char[255];
long long i=0;
while(file)
{
//words are sepearated by spcae
file.getline(arr[i],256,' ');
i++;
}
file.close();
quickSort(arr, 0, i-2);
for(long long j=0;j<i-1;j++)
{
o << arr[j] << "\n";
}
}
对上述列表进行排序需要花费超过10分钟的时间,但不应超过20秒。 (MAXL是1G文件中的单词数,输入的单词存储在文本文件中)
答案 0 :(得分:1)
如果您不能全部容纳在内存中,则基于文件的合并排序会很好地工作。
答案 1 :(得分:0)
就地算法是您的解决方案。查找更多here:
另一个例子是,许多排序算法将数组重新排列成就地排序的顺序,包括冒泡排序,梳状排序,选择排序,插入排序,堆排序和Shell排序。这些算法只需要几个指针,因此它们的空间复杂度为O(log n)。