C++数据结构 排序 二分 插入 冒泡 基数 归并 直选 快排 希尔 堆排序
来源:互联网 发布:小米3怎样才可以4g网络 编辑:程序博客网 时间:2024/06/06 02:01
原文地址:http://hi.baidu.com/sunguangran/blog/item/f972073465c0b347241f1425.html
认真的学习了严蔚敏版的数据结构,感觉应该自己实现一下通用的算法才能有更深入的理解,于是贡献给大家下面这些我自己写的,使用C++模版实现了所有常见的排序算法,所有算法都很短小精悍,gcc编译运行通过(希尔排序除外)。
其中快速排序的代码最短小实用(欢迎各位dx拍砖),last监视哨的思想来自百度百科对qsort的解释----它大大简化了qsort的代码量。后续我将测试所有这些算法性能的情况,并对比C/C++库的标准函数。
(1)2分法查找有序连续内存
(2)插入排序(稳定)----当然,可以用折半插入排序来提高性能
(3)冒泡排序(稳定)
(4)基数排序:O(nlog(r)m)其中r为所采取的基数,而logr(n)=m为堆数,在某些时候,基数排序法的效率高于其它的比较性排序法。合理设计r和m的值,可以得到最有解。它利用了每次比较以后得到的历史信息。需要根据需求具体设计,没有通用形式,必须根据具体问题的信息具体设计,例如扑克牌排序等。它的核心思想是利用数据的某方面的特定信息。下面的例子是排序如果各2位正数,使用了10个桶
(5)归并排序
(6)直接选择排序(不稳定)
(7)快速排序(不稳定)----如果您的实现比我的更简短,欢迎对比:)
(8)希尔排序(不稳定)
可以理解为直接插入排序的变体。这里只给出伪代码:
首先实现一个直接插入排序
void isort(*begin,size_t offset,size_t number);
这里offset是插入排序的间隔,number是插入排序的元素个数
void shellsort(T begin,T end,size_t s){
for(int g=sqr(s);g>1;g=sqr(g)){//分组
size_t gs=s/g;//gs 是 group size
for(int n=0;n<gs;++n){//每次分组以后,处理某个组里面全部的元素
isort(begin+n*g, g, g);
}//每个组的所有元素
if(gs*g<s)isort(begin+gs*g,g,s-gs*g);//末尾剩余的元素
}//若干个组
}
(9)最后隆重推出百万级俱乐部成员: 堆排序。程序模板在gcc3.4.2下验证通过
- C++数据结构 排序 二分 插入 冒泡 基数 归并 直选 快排 希尔 堆排序
- 各种排序算法(冒泡、选择、快排、插入、希尔、堆排、归并、计数、基数)
- 八种排序算法(直接插入,希尔,直接选择,堆,冒泡,快排,归并,基数)
- 排序算法:快排,插入,希尔,归并,堆,选择,冒泡
- C++实现各种基础排序(冒泡、选择、快排、插入、堆排、希尔、归并)
- 链表排序(冒泡、选择、插入、快排、归并、希尔、堆排序)
- 链表排序(冒泡、选择、插入、快排、归并、希尔、堆排序)
- 八种常见排序算法:插入、冒泡、选择、希尔、归并、快排、堆排序、基数排序
- 链表排序(冒泡、选择、插入、快排、归并、希尔、堆排序)
- 常见排序算法总结与实现(冒泡、插入、选择、希尔、堆排序、归并、快排)
- 链表排序(冒泡、选择、插入、快排、归并、希尔、堆排序)
- 排序算法 快排 堆排 选择 插入 希尔 归并
- 插入、希尔、快排、堆排、自然归并排序
- 采用回调函数的内部排序算法-插入排序,希尔排序,冒泡,快排,堆排,归并排,基数排序
- 采用回调函数的内部排序算法-插入排序,希尔排序,冒泡,快排,堆排,归并排,基数排序
- 排序-归并、快排、插入、堆、希尔排序
- 排序(插入,希尔,选择,堆排序,归并,快排)
- 常见排序算法C++实现(冒泡,直接插入,希尔,堆,归并,简单选择,快排)
- .NET 构建模块(Building Blocks)
- .NET 软件
- ARM 系统高效C编程——C编译器及优化概述
- .NET Web Services
- java基础知识之 循环输出---欲罢不能“金字塔”
- C++数据结构 排序 二分 插入 冒泡 基数 归并 直选 快排 希尔 堆排序
- .NET 标准
- JPA中ManyToMany关系问题
- .net 服务
- 为什么需要htons(), ntohl(), ntohs(),htons() 函数
- .net 应用程序
- Linux 系统内核空间与用户空间通信的实现与分析
- 简单的事件通知机制实现
- sicily 1426 PhoneList 使用动态分配是在是太耗时了