建议先看看前言 : http://www.cnblogs.com/tanky_woo/archive/2011/04/09/2010263.html
这一节讲的是非线性排序。
一.计数排序(Counting Sort) 基本思想:对每一个输入元素x,确定出小于x的元素个数。
适用范围:适用于输入是由小范围的整数构成的序列。
稳定性:算法是稳定的。
具体实现:
/*
Author: Tanky Woo Blog: www.WuTianQi.com Description: 计数排序 */ #include
using namespace std; // arr--初始输入数组, res--存放排序结果的数组,hash临时存储区[0...k] int arr[100], res[100], hash[100]; int len, k = -1; void PrintHash() { cout << "Hash数组: " << endl; for(int i=0; i<=k; ++i) cout << hash[i] << " "; cout << endl; } void countingSort() { for(int i=0; i<=k; ++i) hash[i] = 0; // 此过程记录每一个元素的个数 for(int i=1; i<=len; ++i) ++hash[arr[i]]; PrintHash(); // 此过程确定小于x的元素的个数 for(int i=1; i<=k; ++i) hash[i] += hash[i-1]; PrintHash(); // 思考这里为何从i=len开始?而不从i=1开始? for(int i=len; i>0; --i) { res[hash[arr[i]]] = arr[i]; --hash[arr[i]]; } } /* 思考这里为何从i=len开始?而不从i=1开始? 保持排序后结果的稳定性! 因为同一个元素,靠后的元素在排序后相对也是从后开始存入结果数组的。 */ int main() { cout << "输入元素个数: "; cin >> len; cout << "输入" << len << "个元素: " << endl; for(int i=1; i<=len; ++i) { cin >> arr[i]; if(k < arr[i]) k = arr[i]; } countingSort(); cout << "排序后结果为: " << endl; for(int i=1; i<=len; ++i) cout << res[i] << " "; cout << endl; }
输出结果:
二.基数排序(Radix Sort)
基本思想:按组成关键字的各个位的值来实现排序的。
排序方式:
排序方式:LSD 由右向左排; MSD 由左向右排
稳定性:算法是稳定的。
推荐:严蔚敏《数据结构》上的基数排序。
先说下什么是基数:计算的基数就是基本的单元数。比如10进制的基数就是10,二进制的基数就2,八进制的基数是8等等。
基数排序说通俗点,就是把带排序的N个数字右对齐排成一列。然后把相同的位数互相比较,来排序。
例图:
以下是具体实现和分析:
1 /*
2 Author: Tanky Woo 3 Blog: www.WuTianQi.com 4 Description: 基数排序 5 */ 6 #include 7 #include 8 using namespace std; 9 10 int arr[100], res[100], hash[10]; 11 int n; 12 13 int maxbit() 14 { 15 int _max = 0; 16 int temp[100]; 17 for(int i=0; i 0) 24 { 25 tt++; 26 temp[i] /= 10; 27 } 28 if(_max < tt) 29 _max = tt; 30 } 31 cout << "_max : " << _max << endl; 32 return _max; 33 } 34 35 void radixSort() 36 { 37 memset(res, 0, sizeof(res)); 38 int nbit = maxbit(); 39 int tmp; 40 int radix = 1; 41 // 以下和计数排序一样 42 for(int i=1; i<=nbit; ++i) 43 { 44 for(int j=0; j<10; ++j) 45 hash[j] = 0; 46 for(int j=0; j=0; --j) 54 { 55 tmp = (arr[j]/radix)%10; 56 --hash[tmp]; 57 res[hash[tmp]] = arr[j]; 58 } 59 for(int j=0; j> n; 70 cout << "输入" << n << "个元素: " << endl; 71 for(int i=0; i> arr[i]; 73 radixSort(); 74 cout << "排序后结果为: " << endl; 75 for(int i=0; i推荐一个基数排序的动画演示:http://blogimg.chinaunix.net/blog/upfile/070912120349.swf
桶排序就不写了,本质就是计数排序和基数排序的结合。
不过我有点不明白,我们一般说的桶排序貌似就是基数排序?
在我独立博客上的原文:http://www.wutianqi.com/?p=2378
欢迎大家互相学习,互相探讨。
延伸阅读
- 2011-4-21-- 算法导论,《算法导论》学习总结 — 7.第八章(1) 决策树
- 2011-4-19-- 快速排序,《算法导论》学习总结 — 6.第七章 快速排序
- 2011-4-17-- 优先级队列,《算法导论》学习总结 — 5.第六章(2) 优先级队列
- 2011-4-15-- 堆排序算法导论,《算法导论》学习总结 --- 4.第六章(1) 推排序
- 2011-4-10-- 算法导论,《算法导论》学习总结 — 2.第一章 && 第二章 && 第三章
- 2011-4-12-- 算法导论,《算法导论》学习总结 — 3.第四章 && 第五章
- 2011-4-9-- 算法导论,《算法导论》学习总结 --- 1.前言
- 2010-11-24-- 算法的重要性,算法还重要吗?
- 2011-4-6-- kmp算法详解,KMP算法
- 2010-12-15-- 遗传算法,树形算法
最新评论