低内存大小排序

时间:2018-11-21 18:47:49

标签: algorithm performance sorting time quicksort

排序具有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文件中的单词数,输入的单词存储在文本文件中)

2 个答案:

答案 0 :(得分:1)

如果您不能全部容纳在内存中,则基于文件的合并排序会很好地工作。

答案 1 :(得分:0)

就地算法是您的解决方案。查找更多here

  

另一个例子是,许多排序算法将数组重新排列成就地排序的顺序,包括冒泡排序,梳状排序,选择排序,插入排序,堆排序和Shell排序。这些算法只需要几个指针,因此它们的空间复杂度为O(log n)。