我的计数排序与我填充数字的数组一起工作。现在我想这样做,所以我从输入文件中获取信息。我将输入具有大量数字的输入文件(范围从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;
答案 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排序算法。
对于普通整数,很难确定稳定性。因此,您可以选择上述技术来快速对输入进行排序。