除前K个和后K个元素外的已排序数组

时间:2019-01-07 11:25:24

标签: algorithm sorting

已知大小为n的数组A被排序,除了前k个元素和后k个元素(其中k为常数)之外。以下哪种算法最适合对数组进行排序?

 A) Quicksort
 B) Bubble sort
 C) Selection Sort
 D) Insertion Sort

给出的答案是D。

无法理解它的工作原理,如果还给出了合并排序,答案将会是什么?

2 个答案:

答案 0 :(得分:2)

让我们看一下算法的复杂性:

A)快速排序:情况更糟 O(n²)平均 O(n log n)
 B)冒泡排序:需 O(n²)
 C)选择排序:将采用 O(n²)
 D)插入排序:如果k为常数= O(n)

,将采用 O(k * 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(k log k)
  • 对k个元素进行排序 O(k log k)
  • 合并3个列表 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?