之前想写字符子串查找来着一直没有时间
前两天搞了个多key 的排序就看了golang的排序算法
源码在 sort/sort.go 文件
实现了两种排序一种快速排序 为不稳定的排序 一种是稳定的排序
什么叫做不稳定排序
为了实排序需要自己定义比较原则,获取长度函数等
go已经内部实现了int,float等类型的排序,不需要自己定义less等函数了
主要排序实现在 quicksort 函数和stable 函数 一个是快速排序但是不稳定的,一个是稳定排序
在被排序对象长度>12 的情况下用的是先进行局部快排,在深度等于0 的时候再进行堆排序(这个时候每个堆应该是大致有序的吧),在长度小于12 的情况下先进行一轮步长为6 的希尔排序,在进行插入排序
用的排序算法都是我们日常接触的 ,有的新鲜的就是在doPivot() 这个函数选择快排的Pivot 有点技巧 ,要取得一个好的中间值,又尽量进行少次的比较,go 用的方法是 Tukey's Ninther
关于这个 Tukey's Ninther 有个链接可以看下
John Tukey's median of medians | ninther
在长度小于12 直接进行插入排序或者在快排几轮基本有序的情况下进行插入排序,插入排序在基本有序的情况下可以达到线性的速度
稳定排序
使用归并算法排序 看了个大概,后面有时间再看下
总结: golang 排序虽然用的都是我们常见的算法,但是考虑的非常多,也非常细致(比如说防止过深的递归了之类的),大神就是大神,各种算法的论文,变种,优劣,类比都如数家珍,感觉自己就是仅仅知道这个算法,会用,会实现而已,虽然我和大神差的很远,但是我还是要一点一点缩短我们之间的距离,哪怕是一点,也要进步(o(* ̄︶ ̄*)o)