计数排序 COUNTING_SORT
计数排序假设n个输入元素中每一个都是在0到k区间内的一个整数。其中k为某个整数。当k=O(n)时,排序的运行时间为Θ(n).
计数排序的基本思想是:
对每一个输入元素x,确定小于x的元素个数。利用这一信息,就可以直接吧x放到它在输出数组中的位置上了。
例如,如果有17个元素小于x,则x就应该在第18个输出位置上。
当有几个元素位置相同时,这一方案要略作修改。因为不能把他们放在同一个位置上输出。
下面依旧直接上代码,有详细注释(演示图就不贴了,可以看算法导论)
#include <stdio.h>
#include <iostream>
#include <vector>
#include <time.h>
#include <fstream>
using namespace std;
vector<int> d;
vector<int> b, c; //b为输出数组, c为缓存数组
void ReadData();
void PrintVector(const vector<int> &a);
void COUNTING_SORT(vector<int> &a); //计数排序
int FindMax(vector<int> &a); //寻找数组最大值
int main()
{
clock_t end; clock_t start = clock();
double TotalTime;
ReadData(); //cout << d.size() << endl; system("pause");
COUNTING_SORT(d);
cout << "Sorted : " << endl;
PrintVector(b);
end = clock();
TotalTime = (double)(end - start) / CLOCKS_PER_SEC;
cout << "\nTotal Running Time : " << TotalTime << " s \n";
system("pause");
return 0;
}
int FindMax(vector<int> &a)
{
int max = 0;
for (auto iter = a.begin(); iter != a.end(); iter++)
{
if (*iter > max)
max = *iter;
}
return max;
}
void COUNTING_SORT(vector<int> &a)
{
int max = FindMax(a);
c.resize(max+1); //c从下标0开始,故0..max 共max+1个元素
b.resize(d.size()); // 输出数组与输入数组大小一样即可
for (int i = 0; i <a.size(); i++)
{
int num = a[i];
c[num] = c[num] + 1; // c[num]记录 数组a中大小为num的元素个数
}
for (int i = 1; i < c.size(); i++) //数组c 含max+1个元素
{
c[i] = c[i] + c[i - 1]; // c[0] = c[0],不用加;c[1]=c[1]+c[0]
// c[i] 记录数组a中 <=i 的元素的总数
}
for (int i = a.size()-1 ; i >= 0; i--)
{
int num1 = a[i]; //
int num2 = c[num1]; //num2为 a数组中小于等于num1的元素总数,即num1应该在的位置
//若num1=max,此时num2最大为a.size()
b[num2-1] = a[i]; //
c[num1] = c[num1] - 1;
}
}
void ReadData()
{
fstream InFile("E:/QT/SelectionSort/data.txt");
int num = 0;
while (!InFile.eof())
{
InFile >> num;
d.push_back(num);
}
d.pop_back();
}
void PrintVector(const vector<int> &a)
{
for (auto iter = a.begin(); iter != a.end(); iter++)
{
cout << *iter << "\t";
}
}
ps. 发现csdn博客不能上传附件啊…