C 为什么快速排序比计数排序好?

C 为什么快速排序比计数排序好?,c,algorithm,sorting,quicksort,counting-sort,C,Algorithm,Sorting,Quicksort,Counting Sort,快速排序: 最坏情况o(n^2) 平均情况O(nlogn) 计数排序: 在所有情况下o(n) 快速排序和计数排序都是稳定的算法 如果存在这两种情况,为什么快速排序仍然比计数排序好?排序并不一定总是比另一种“更好”。在某些情况下,出于以下几个原因,可能会首选快速排序: 与计数排序不同,快速排序需要创建大量数组(例如,使用更多内存)才能完成工作 看起来计数排序是O(n),但看看必须创建的中间计数数组。计数数组长度本质上是原始数组中最大和最小元素之间的差值。如果射程真的很大,那么这个计数阵列就

快速排序:

  • 最坏情况o(n^2)
  • 平均情况O(nlogn)
计数排序:

  • 在所有情况下o(n)
快速排序和计数排序都是稳定的算法


如果存在这两种情况,为什么快速排序仍然比计数排序好?

排序并不一定总是比另一种“更好”。在某些情况下,出于以下几个原因,可能会首选快速排序:

  • 与计数排序不同,快速排序需要创建大量数组(例如,使用更多内存)才能完成工作

  • 看起来计数排序是O(n),但看看必须创建的中间计数数组。计数数组长度本质上是原始数组中最大和最小元素之间的差值。如果射程真的很大,那么这个计数阵列就是巨大的。例如,如果数组只有两个元素,但这两个元素是1和9999999,该怎么办?这个计数数组必须被处理(所有的求和和和计数的东西)。实际上,计数排序的运行时间是O(n+k),其中k是原始数组中最大和最小元素之间的差值

  • 最后,如果要排序的元素不是数字,那么计数排序似乎很难实现。它对字符串如何工作

  • 不同的种类不一定总是比其他种类“更好”。在某些情况下,出于以下几个原因,可能会首选快速排序:

  • 与计数排序不同,快速排序需要创建大量数组(例如,使用更多内存)才能完成工作

  • 看起来计数排序是O(n),但看看必须创建的中间计数数组。计数数组长度本质上是原始数组中最大和最小元素之间的差值。如果射程真的很大,那么这个计数阵列就是巨大的。例如,如果数组只有两个元素,但这两个元素是1和9999999,该怎么办?这个计数数组必须被处理(所有的求和和和计数的东西)。实际上,计数排序的运行时间是O(n+k),其中k是原始数组中最大和最小元素之间的差值

  • 最后,如果要排序的元素不是数字,那么计数排序似乎很难实现。它对字符串如何工作

  • 你检查过计数排序的限制吗?我的意思是你可以运行计数排序的先决条件是什么?通常不被视为稳定的类别。可以排序的类型有一些主要的限制。@machine_1:排序方面的“stable”有一个特定的含义,即如果比较的两个条目相等,则它们将以排序开始前的相同相对顺序出现在排序结果中。快速分拣是完全可靠的;它不稳定。(参见我之前评论中的Wikipedia链接——它指定快速排序是不稳定的。它还有一个链接,指向构成稳定排序的信息。)这个问题的判断过于严厉。这是一个有合理答案的合理问题。任何关于“更好”是一种意见的抱怨都可以通过编辑处理。计数排序根本不利于缓存。一个好的泛型计数排序通常有一个计数数组,单位为MBs。CPU缓存甚至可能无法容纳如此多的数据,而且由于命中计数数组中任何索引的机会都是随机的,因此会不断出现缓存未命中。您是否检查了计数排序的约束条件?我的意思是你可以运行计数排序的先决条件是什么?通常不被视为稳定的类别。可以排序的类型有一些主要的限制。@machine_1:排序方面的“stable”有一个特定的含义,即如果比较的两个条目相等,则它们将以排序开始前的相同相对顺序出现在排序结果中。快速分拣是完全可靠的;它不稳定。(参见我之前评论中的Wikipedia链接——它指定快速排序是不稳定的。它还有一个链接,指向构成稳定排序的信息。)这个问题的判断过于严厉。这是一个有合理答案的合理问题。任何关于“更好”是一种意见的抱怨都可以通过编辑处理。计数排序根本不利于缓存。一个好的泛型计数排序通常有一个计数数组,单位为MBs。CPU缓存甚至可能无法容纳那么多的数据,而且由于命中计数数组中任何索引的机会都是随机的,因此会不断出现缓存未命中的情况。简而言之,计数排序对一般任意长度的字符串不起作用。感谢第二点是令人满意的感谢很多
    k
    可以被认为是不同元素的数量,而不是元素的范围,但很少有不同元素的数量大大小于范围(例如值为1和9999999的两个不同元素的示例),并且需要映射才能将元素值转换为映射索引。简而言之,计数排序对一般任意长度的字符串不起作用。感谢第二点令人满意,感谢lot
    k
    可以被认为是不同元素的数量,而不是元素的范围,但不同元素的数量很少ENT要比范围小得多(例如值为1和9999999的两个不同元素的示例),需要进行映射才能将元素值转换为映射索引。