计数排序及其C++实现

计数排序 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博客不能上传附件啊…

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值