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下验证通过

原创粉丝点击