计算输入文件

时间:2015-11-04 03:46:57

标签: c++ sorting file-io counting-sort

我的计数排序与我填充数字的数组一起工作。现在我想这样做,所以我从输入文件中获取信息。我将输入具有大量数字的输入文件(范围从0到4000)。我还会将该文件中的项目数量提供给我。如何调整此代码以适用于任何输入文件?

    int array[10]={5,5,5,5,5,5,1,2,5,7};
    int count_array[10]={0};
    int sum=0;
    int new_array[10];
    int i;

    for(i=0;i<10;i++)
        count_array[array[i]]++;

    for(i=0;i<10;i++)
    {
        count_array[i]=count_array[i]+sum;
        sum=count_array[i];
    }

    for(i=0;i<10;i++)
    {
        new_array[count_array[array[i]]]=array[i];
        count_array[array[i]]--;
    }

    for(i=1;i<=10;i++)
    {
        cout<<new_array[i]<<" ";               
    }
    cout<<endl;

1 个答案:

答案 0 :(得分:1)

如果您正在处理整数,并且您确定在您的情况下范围为0-4000。

然后你可以安全地忽略计数排序,并做一些像计算频率的事情,你最终会在文件中对整数进行排序。

请参阅以下代码,该代码对constant space(4001*siz4eof(int))theta(N)时间

中的输入进行排序
#include <fstream>
#include <iostream>
#include <string>
#include <cstring>
#include <cassert>

#define MAX_VALUE 4001

int main()
{
    std::ifstream in("D:\\cprog\\file.txt");
    std::string line;
    int arr[MAX_VALUE];
    memset(arr,0,sizeof(arr));
    while(std::getline(in,line))
    {
        int a = std::stoi(line);
        assert(a<MAX_VALUE);
        arr[a] += 1; // counting frequency of a number
    }
    std::cout<<"Sorted result"<<'\n';
    for(int i = 0; i < MAX_VALUE ; ++i)
    {
        for(int j = 0 ; j < arr[i] ; ++j)
            std::cout<<i<<'\n';
    }
    return 0;
}

计数排序是stable sorting technique,为排序算法提供了基础,如Redix排序算法。

对于普通整数,很难确定稳定性。因此,您可以选择上述技术来快速对输入进行排序。