算法导论第八章-线性时间排序-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"); }
测试结果:
相关文章推荐
- C#数据结构之顺序表(SeqList)实例详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 数据结构之Treap详解
- C++计数排序详解
- 用C语言举例讲解数据结构中的算法复杂度结与顺序表
- C#数据结构之堆栈(Stack)实例详解
- C#数据结构之双向链表(DbLinkList)实例详解
- JavaScript数据结构和算法之图和图算法
- Java数据结构及算法实例:冒泡排序 Bubble Sort
- Java数据结构及算法实例:插入排序 Insertion Sort
- Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture
- java数据结构之java实现栈
- java数据结构之实现双向链表的示例
- Java数据结构及算法实例:选择排序 Selection Sort
- Java数据结构及算法实例:朴素字符匹配 Brute Force
- Java数据结构及算法实例:汉诺塔问题 Hanoi