📜  数据结构和算法插入排序

📅  最后修改于: 2021-01-11 10:22:05             🧑  作者: Mango


这是基于就地比较的排序算法。在此,将始终维护一个子列表。例如,数组的下部保持被排序。要“插入”此排序子列表中的元素,必须找到其适当的位置,然后将其插入到该位置。因此,名称为insert sort

依次搜索该数组,然后将未排序的项目移动并插入到已排序的子列表中(在同一数组中)。该算法不适用于大型数据集,因为其平均和最坏情况下的复杂度均为〇(n 2 ),其中n是项数。

插入排序如何工作?

我们以一个未排序的数组为例。

未排序的数组

插入排序比较前两个元素。

插入排序

它发现14和33都已经按升序排列。目前,已排序的子列表中有14个。

插入排序

插入排序向前移动,并将33与27进行比较。

插入排序

并发现33位置不正确。

插入排序

它将33与27交换。它还将检查已排序子列表的所有元素。在这里,我们看到排序后的子列表只有一个元素14,而27大于14。因此,交换后,排序后的子列表仍然保持排序。

插入排序

到目前为止,我们在排序的子列表中有14和27。接下来,将33与10相比较。

插入排序

这些值不是按排序的顺序。

插入排序

因此,我们交换它们。

插入排序

但是,交换使27和10未排序。

插入排序

因此,我们也交换它们。

插入排序

同样,我们以未排序的顺序找到14和10。

插入排序

我们再次交换它们。到第三次迭代结束时,我们有了一个包含4个项目的排序子列表。

插入排序

继续进行此过程,直到所有未排序的值都包含在已排序的子列表中为止。现在我们将看到插入排序的一些编程方面。

算法

现在,我们对这种排序技术的工作原理有了更全面的了解,因此我们可以推导简单的步骤来实现插入排序。

Step 1 − If it is the first element, it is already sorted. return 1;
Step 2 − Pick next element
Step 3 − Compare with all elements in the sorted sub-list
Step 4 − Shift all the elements in the sorted sub-list that is greater than the 
         value to be sorted
Step 5 − Insert the value
Step 6 − Repeat until list is sorted

伪码

procedure insertionSort( A : array of items )
   int holePosition
   int valueToInsert
    
   for i = 1 to length(A) inclusive do:
    
      /* select value to be inserted */
      valueToInsert = A[i]
      holePosition = i
      
      /*locate hole position for the element to be inserted */
        
      while holePosition > 0 and A[holePosition-1] > valueToInsert do:
         A[holePosition] = A[holePosition-1]
         holePosition = holePosition -1
      end while
        
      /* insert the number at hole position */
      A[holePosition] = valueToInsert
      
   end for
    
end procedure

要了解使用C编程语言进行的插入排序实现,请单击此处