在各类算法中那种算法排序是最快的?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在各类算法中那种算法排序是最快的?相关的知识,希望对你有一定的参考价值。

说句实话,没有最快这一说。

    如果不在乎浪费空间,应该是桶排序最快

    如果整体基本有序,插入排序最快

    如果考虑综合情况,快速排序更加实用常见(希尔排序、堆排序等各种排序也各有优劣)

    一般情况下,冒泡这种排序仅仅是名字起的有趣罢了,不太好用

参考技术A 随机化快速排序。。。
桶排序貌似最快。。
参考技术B 直接插入排序:当数据有序时,执行效率最好,此时的时间复杂度为O(n);当数据基本反序时,执行效率最差,此时的时间复杂度为O(n2)。所以当数据越接近有序,直接插入排序算法的性能越好。
希尔排序 :时间效率为O(n(log2n)2)
直接选择排序:时间效率为 O(n^2)——虽移动次数较少,但比较次数仍多。
堆排序:时间效率为O(nlog2n)
冒泡排序:时间效率为O(n^2) —因为要考虑最坏情况(数据元素全部逆序),当然最好情况是数据元素已全部排好序,此时循环n-1次,时间复杂度为O(n)
快速排序:
时间效率:一般情况下时间复杂度为O(nlog2n),最坏情况是数据元素已全部正序或反序有序,此时每次标准元素都把当前数组分成一个大小比当前数组小1的子数组,此时时间复杂度为O(n2)本回答被提问者采纳

搜索排序数组的最快搜索算法

【中文标题】搜索排序数组的最快搜索算法【英文标题】:fastest search algorithm to search sorted array 【发布时间】:2015-11-12 20:25:04 【问题描述】:

我有一个只有值 0 和 1 的数组。它们分别存储在数组中。例如,数组可能有前 40% 为 0,其余 60% 为 1。我想找出 0 和 1 之间的分割点。我想到的一种算法是二分搜索。由于性能对我来说很重要,所以不确定二分搜索是否能给我最好的性能。分裂点是随机分布的。该数组以 0 和 1 拆分的格式给出。

【问题讨论】:

为什么不只计算零和一的数量,而不是对数组进行排序和搜索? 如果你只有一个数组来存储,二分查找是你能得到的最快的。为什么你会认为这太慢了? 如果分割点的位置是随机分布的(即得到40/60分割的概率与得到1/99、99/1、50/50等分割的概率相同)那么二分查找是解决这个问题的最快方法。 嘿@Fuser97381,如果你有数组怎么办?这种方法变得次优。请看我的回答。 如果你只有一点点,为什么还要存储在数组中?将它们存储为 long,您将立即获得 0 的数量。数组在这里是错误的数据结构。 【参考方案1】:

当您给定数组时,保持计数的看似聪明的答案并不成立。

计数是O(n),线性搜索也是如此。因此,计数不是最优的!

二分搜索是您的朋友,可以在O(lg n) 时间完成工作,您可能知道是way better。

当然,如果您无论如何都必须处理数组(从文件读取、用户输入等),请利用这段时间计算1s0s 的数量并完成它(您甚至不必存储任何数据,只需保留计数即可。

为了说明这一点,如果你正在编写一个库,它有一个名为 getFirstOneIndex(sortZeroesOnesArr: Array[Integer]): Integer 的函数,它接受一个由 1 和 0 组成的排序数组并返回第一个 1 的位置,不要计算,二分查找.

【讨论】:

除非有问题的数组来自外部源,否则无论生成数组的任何代码,在不丢失信息和不浪费内存的情况下,都会保留计数。这听起来像是一个经典的 XY 问题。不过——你的答案很好,所以我会赞成。

以上是关于在各类算法中那种算法排序是最快的?的主要内容,如果未能解决你的问题,请参考以下文章

桶排序算法:最快最简单的排序算法

数据结构—各类‘排序算法’实现(下)

最快最简单的排序算法:桶排序

最快最简单的排序算法:桶排序

打造 Go 语言最快的排序算法

数据结构—各类‘排序算法’实现(上)