世界上最快的排序算法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了世界上最快的排序算法相关的知识,希望对你有一定的参考价值。
Timsort是一个自适应的、混合的、稳定的排序算法,融合了归并算法和二分插入排序算法的精髓,在现实世界的数据中有着特别优秀的表现。它是由Tim Peter于2002年发明的,用在Python这个编程语言里面。这个算法之所以快,是因为它充分利用了现实世界的待排序数据里面,有很多子串是已经排好序的不需要再重新排序,利用这个特性并且加上合适的合并规则可以更加高效的排序剩下的待排序序列。 参考技术A世界上最快的排序算法是Tim Peter于2002年发明的,用在Python这个编程语言里面。因此被命名为Timsort算法。
算法简述:
如果长度小于64直接进行插入排序
首先遍历数组收集每个元素根据特定的条件组成一个run
得到一个run之后会把他放入栈中
如果栈顶部几个的run符合合并条件,就会触发合并操作合并相邻的两个run留下一个run
合并操作会使用尽量小的内存空间和GALLOP模式来加速合并
你绝对想不到,世界上最奇葩的排序算法!
前段时间,分享了《算法导论》中,时间复杂度为O(n)的三种排序:
一个代码极具美感的最美排序:
以及一个只具有分析意义的最慢排序:
然后有水友在评论中留言“是不是下一期要讲睡眠排序了?”。楼主才疏学浅,没有听过“睡眠排序”,网上搜了一下,眼界大开。
这是一个不但没有工程意义,也不具有分析意义,甚至未必能得到正确的排序结果的排序。既然大伙充满好奇心,那就简单分享一下。
话不多说,先上伪代码:
void sleep_sort(uint arr[], uint n){
for(uint i=0;i<n;i++){
Thread t = new Thread(){
@Override
public void run(){
sleep(arr[i]);
print(arr[i]);
}
};
t.start();
}
}
看了伪代码,很容易理解其核心思路是:
(1)循环遍历待排序数组中的每一个元素x;
(2)启动一个新线程,睡眠x毫秒,然后输出x;
算法认为:
(1)小的元素xi,睡眠时间少,会先输出;
(2)大的元素xj,睡眠时间长,会后输出;
看完算法,请不要提出如下疑问:
(1)如果元素是负数怎么办?
(2)如果元素很接近怎么办?
(3)为什么没有考虑线程调度时间?
(4)如果线程太多,CPU调度不过来怎么办?
(5)…
《世界上最慢的排序算法!》尚有时间复杂度分析的意义,睡眠算法似乎完全没有什么luan用。哎,如果认真,我们就输了。
能够想出这个算法的童鞋,你真是个天才。
调研:
你还见过更奇葩的排序算法吗?
时间复杂度为O(n)的三种排序:
另外:
你知道睡眠排序的时间复杂度是多少吗?
以上是关于世界上最快的排序算法的主要内容,如果未能解决你的问题,请参考以下文章