CLRS 8.3基数排序
2015-10-29 14:46
337 查看
8.3-1
从左到右分别是原始排序,第一轮、第二轮和最终排序。
8.3-2
稳定:插入排序,归并排序。不稳定:堆排序,快速排序。
通过给每个元素添加一个最初位置属性,当元素值相等时比较初始位置。从而使得排序稳定,需要额外空间 Θ(n)\Theta(n)。
8.3-3
从低到高位排序,现在假设第 tt 位已经排序好,并且是稳定的排序。在第 t+1t+1 位:
1) 第 t+1t+1 位需要排序的数相等,不需要变动第 t+1t+1 位,且第 tt 位是稳定的排序,因此第 t+1t+1 位也是稳定的排序。
2)第 t+1t+1 位需要排序的数不相等,对第 t+1t+1 位进行排序,可知排序后第 t+1t+1 位是稳定的。
综上,可知基数排序是正确的。
8.3-4
使用基数排序,将每个数转换为 nn 进制,则每个数占 3 位。这样就有 Θ(3(n+n))=Θ(6n)=Θ(n)\Theta(3(n + n)) = \Theta(6n) = \Theta(n)。
8.3-5
一共进行 Θ(10d)\Theta(10^d) 次排序。需要记录 Θ(10d)\Theta(10d) 堆卡片。
附上10进制数的基数排序(只能排序自然数)
从左到右分别是原始排序,第一轮、第二轮和最终排序。
8.3-2
稳定:插入排序,归并排序。不稳定:堆排序,快速排序。
通过给每个元素添加一个最初位置属性,当元素值相等时比较初始位置。从而使得排序稳定,需要额外空间 Θ(n)\Theta(n)。
8.3-3
从低到高位排序,现在假设第 tt 位已经排序好,并且是稳定的排序。在第 t+1t+1 位:
1) 第 t+1t+1 位需要排序的数相等,不需要变动第 t+1t+1 位,且第 tt 位是稳定的排序,因此第 t+1t+1 位也是稳定的排序。
2)第 t+1t+1 位需要排序的数不相等,对第 t+1t+1 位进行排序,可知排序后第 t+1t+1 位是稳定的。
综上,可知基数排序是正确的。
8.3-4
使用基数排序,将每个数转换为 nn 进制,则每个数占 3 位。这样就有 Θ(3(n+n))=Θ(6n)=Θ(n)\Theta(3(n + n)) = \Theta(6n) = \Theta(n)。
8.3-5
一共进行 Θ(10d)\Theta(10^d) 次排序。需要记录 Θ(10d)\Theta(10d) 堆卡片。
附上10进制数的基数排序(只能排序自然数)
#include <iostream> using std::cout; using std::endl; //辅助函数,求n个数据的最大数的位数 int maxBit(int *data,int begin,int end) { int res = 1, radix = 10; for(int i = begin; i < end; i++) { while(data[i] >= radix){ ++res; radix *= 10; } } return res; } /***基数排序,不能含有负数******************* ****排序数组的begin到end位置的数(不含end)** *****************************************/ void radixsort(int data[], int begin,int end) { int d = maxBit(data,begin,end); int *tmp = new int[end-begin]; int *count = new int[10];//计数器 int radix = 1; for(int i = 0; i < d; i++)//进行d次排序 { memset(count,0,sizeof(int)*10);//每次分配前清空计数器 for(int j = begin; j < end; j++) { int k = (data[j] / radix) % 10; count[k]++;//统计每个桶中的记录数 } for(int j = 1; j < 10; j++) count[j] += count[j-1]; for(int j = end - 1; j >= begin; j--) { int k = (data[j] / radix) % 10; tmp[count[k]-1] = data[j]; --count[k]; } for(int j = begin; j < end; j++)//将临时数组的内容复制到data中 data[j] = tmp[j-begin]; radix *= 10; } delete []tmp; delete []count; } int main() { int ia[] = {329,457,657,839,436,720,355}; radixsort(ia,2,7); for(int i = 0; i < 7; i++) cout << ia[i] << ' '; return 0; }
相关文章推荐
- lr_save_string 和 sprintf 的使用
- handler 异步执行(进度条加载到100)
- 性能测试分享:jmeter性能监控(一)
- java中堆和栈的区别!!!!
- Android应用程序四大组件之使用AIDL如何实现跨进程调用Service
- Mingw & VC -- DLL
- Swift开发记录 - 升级Xcode7&iOS9带来的问题
- Android基础入门教程——7.2.2 Android JSON数据解析
- HTML5规范~
- 性能测试培训:WebSocket协议的接口性能之Jmeter
- linux内核设计与实现--内存管理
- IT蓝豹强烈推荐:符合1-2年工作经验,开发中的难点及相关优化:
- JavaScript如何处理可变参数
- Update Subversion on Mac OS X
- OOP:面向对象编程
- Android中AsyncTask与handler用法实例分析
- Rect四个参数解释
- 在Android Studio上快速导入Eclipse风格
- 2015年10月27日作业
- Android应用中实现了QQ授权登录功能