1、主要思想:
借助一个中间数组data_b来保存data数组中任意小于或等于data[i]元素的个数,以此来定位data[i]在数组中的位置(按大小排序的第几位)。该过程中不存在任意两个数之间的比较。
2、代码:
//计数排序
#include <iostream>
#include <vector>
using namespace std;
void count_sort(vector<float> data,int k);
int main()
{
//接收排序数据
vector<float> sort_data;
float data;
while ((cin>>data)&&(data!='a'))
{
sort_data.push_back(data);
}
//显示需要排序的数据
cout<<"The set of data show as:"<<endl;
for (int i=0;i<sort_data.size();i++)
{
cout<<sort_data[i]<<"\t";
}
cout<<endl;
//对数据进行排序,从小到大
cin.clear();//重置错误输入
cin.sync();//清空缓冲区
cout<<"input the max number:";
int max_k;
cin>>max_k;
//显示排序完的数据
cout<<"The set of data after sorting show as:"<<endl;
count_sort(sort_data,max_k);
system("pause");
return 0;
}
void count_sort(vector<float> data,int k)
{
vector<float> data_b;//记录小于i的元素的个数
for(int i=0;i<=k;i++)
data_b.push_back(0);
vector<float> data_c;//保存最终的排序结果
for(int i=0;i<data.size();i++)
data_c.push_back(0);
//统计等于i的元素的个数
for(int i=0;i<data.size();i++)
{
data_b[data[i]]++;
}
//统计小于或等于i的元素的个数
for(int i=1;i<=k;i++)
{
data_b[i]+=data_b[i-1];
}
//依据data_b的值来排序
for(int i=data.size()-1;i>=0;i--)//保证稳定排序
{
data_c[data_b[data[i]]-1]=data[i];
data_b[data[i]]--;
}
/*for(int i=0;i<data.size();i++)//保证稳定排序
{
data_c[data_b[data[i]]-1]=data[i];
data_b[data[i]]--;
}*/
for (int i=0;i<data_c.size();i++)
{
cout<<data_c[i]<<"\t";
}
cout<<endl;
}
3、时间复杂度:O(n) 。