您的位置:首页 > 编程语言 > C语言/C++

算法导论第八章-线性时间排序-Cpp代码实现

2016-06-06 20:37 495 查看

实现了3个线性时间的排序方法,分别是计数排序,基数排序和桶排序。都是根据特定场景下实现的。

linear_time_sort.h

#pragma once

/*************************************************
Author:董小歪
Date:2016-06-06
Description:算法导论第八章-线性时间排序-Cpp代码实现
**************************************************/

#ifndef LINEAR_TIME_SORT_H
#define LINEAR_TIME_SORT_H

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

template <typename T>
class Linear_Sort_Tool {
public:

void CountingSort(const vector<T> &input, vector<T> &output, const int range);		//计数排序。range参数表示数据分布从0到range
void RadixSort(vector<int> &input, const int d);					//基数排序。参数d表示排序数据的位数
void BucketSort(vector<double> &input);							//桶排序。这里的桶排序并非通用的,而是根据书上的特例所写
private:
void stable_sort_by_countingsort(vector<int> &input, int i);				//基数排序时使用的稳定排序
};

template <typename T>
void Linear_Sort_Tool<T>::CountingSort(const vector<T> &input, vector<T> &output, const int range)
{
output.resize(input.size());
vector<int> temp(range + 1, 0);
for (int i = 0; i < input.size(); ++i)
++temp[input[i]];//统计每个数出现的次数
for (int i = 1; i < temp.size(); ++i)
temp[i] += temp[i - 1];//累加
for (int i = input.size() - 1; i >= 0; --i)
{
output[temp[input[i]] - 1] = input[i];//累加的个数就是最后结果的位置。这里下标从0开始,所以-1,和书上略有不同
--temp[input[i]];
}
}

template <typename T>
void Linear_Sort_Tool<T>::RadixSort(vector<int> &input, const int d)
{
for (int i = 0; i < d; ++i)
{
stable_sort_by_countingsort(input, i);//对每一位采用稳定的排序法。这里选择用计数排序
}
}

template <typename T>
void Linear_Sort_Tool<T>::stable_sort_by_countingsort(vector<int> &input, int i)
{
vector<int> temp(input.size(), 0), cnt(10, 0);
for (int j = 0; j < input.size(); ++j)
++cnt[static_cast<int>(input[j] / pow(10, i)) % 10]; //注意类型转换
for (int j = 1; j < cnt.size(); ++j)
cnt[j] += cnt[j - 1];
for (int j = input.size() - 1; j >= 0; --j)
{
temp[cnt[static_cast<int>(input[j] / pow(10, i)) % 10] - 1] = input[j];
--cnt[static_cast<int>(input[j] / pow(10, i)) % 10];
}

cout << "第" << (i + 1) << "趟基数排序后:";
for (int i = 0; i < temp.size(); ++i)
cout << temp[i] << " ";
cout << endl;
input = temp;
}

template <typename T>
void Linear_Sort_Tool<T>::BucketSort(vector<double> &input)
{
vector<vector<double>> bucket(10, vector<double>()); //这里对两位小数进行排序,所以桶的个数就是10
for (int i = 0; i < input.size(); ++i)
bucket[input[i] * 10].push_back(input[i]); //放入对应的桶里。这里开始都是空的,不会占用多余的空间。
input.clear();
for (int i = 0; i < bucket.size(); ++i)
{
sort(bucket[i].begin(), bucket[i].end()); //对每一个桶进行排序,这里直接用STL的sort排序
for (int j = 0; j < bucket[i].size(); ++j) //排序后直接记录结果中
input.push_back(bucket[i][j]);
}
}

#endif // !LINEAR_TIME_SORT_H


测试

main_entrance.cpp

#include "linear_time_sort.h"

int main()
{
Linear_Sort_Tool<int> tool;

vector<int> input1 = { 2,5,3,0,2,3,0,3 }, output1;
cout << "input1原数组:";
for (int i = 0; i < input1.size(); ++i)
cout << input1[i] << " ";
cout << endl;
cout << "计数排序后:";
tool.CountingSort(input1, output1, 5);
for (int i = 0; i < output1.size(); ++i)
cout << output1[i] << " ";
cout << endl << endl;

vector<int> input2 = { 329,457,657,839,436,720,355 }, output2;
cout << "input2原数组:";
for (int i = 0; i < input2.size(); ++i)
cout << input2[i] << " ";
cout << endl;
tool.RadixSort(input2, 3);
cout << endl;

vector<double> input3 = { 0.78, 0.17, 0.39, 0.26, 0.72, 0.94, 0.21, 0.12, 0.23, 0.68 };
cout << "input3原数组:";
for (int i = 0; i < input3.size(); ++i)
cout << input3[i] << "  ";
cout << endl;
tool.BucketSort(input3);
cout << "桶排序后:";
for (int i = 0; i < input3.size(); ++i)
cout << input3[i] << "  ";
cout << endl;

system("pause");
}


测试结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息