已知大小为n的数组A被排序,除了前k个元素和后k个元素(其中k为常数)之外。以下哪种算法最适合对数组进行排序?
A) Quicksort
B) Bubble sort
C) Selection Sort
D) Insertion Sort
给出的答案是D。
无法理解它的工作原理,如果还给出了合并排序,答案将会是什么?
答案 0 :(得分:2)
让我们看一下算法的复杂性:
A)快速排序:情况更糟 O(n²)平均 O(n log n)
B)冒泡排序:需 O(n²)
C)选择排序:将采用 O(n²)
D)插入排序:如果k为常数= O(n)
因此 D 具有最佳性能。 (对于k个元素中的每一个:O(log n)来查找要插入到+ O(n)的位置)
但是,由于Quicksort已知具有较小的konstant faktor,并且平均O(n log n),因此“较大” k值最有可能更快。
其他:
E)合并排序:将采用 2 * O(k log k)+ O(n)
总而言之,常数k为 O(n),因此基于复杂度,与插入排序相同。
但是如果用k而不是常数来观察它:
合并排序: O(k log k)+ O(n)
插入排序: O(k * n)
因此插入排序将更快。
反对合并排序的参数:
通常,合并排序是不的(插入排序是),因此,您将需要额外的空间或非常聪明的实现变体来设法就地进行合并,而不会增加太多复杂性。
答案 1 :(得分:0)
由于第一个 K 个元素和最后一个 K 个元素是常数,因此计算它们的复杂度实际上是没有意义的,因为它将是常数。
将上述所有算法与它们的复杂度进行比较:
A)快速排序:最坏情况 O(n²)平均值 O(n log n)
B)气泡排序:O(n²)
C)选择排序:O(n²)
D)插入排序:如果k = constant = O(n),则O(k * n)
如果反转计数为O(n),则插入排序的时间复杂度为O(n)。在最坏的情况下,可能会有n (n-1)/ 2个反转。最坏的情况发生在数组以相反顺序排序时。因此,插入排序的最坏情况下的时间复杂度是O(n2)。*
因此,一般来说,快速排序是最好的,但是对于小型“列表插入”排序,具有 优势:
对于小n来说,插入排序更快,因为快速排序在递归函数调用中有额外的开销。插入排序也是 比快速排序更稳定,并且需要更少的内存。
请参见Why is Insertion sort better than Quick sort for small list of elements?