插入排序算法
到目前为止,“文章”部分中充满了慢速排序算法。 冒泡排序和选择排序虽然很容易理解,但在Θ(n ^ 2)运行时是相对较慢的算法。 在这里,我将尝试解释一种对数字数组进行排序的算法,该算法对于少量数据集来说是快速的,尽管它仍然是O(n ^ 2)算法; 插入排序。
假设我们有一个n-1个元素的数组,这些数组已经按升序排序。 然后,我们将第n个元素(我们称其为x)“插入”到此排序数组中。 随之而来的是,数组的某些部分中的元素小于x,而另一部分中的元素大于x。 此外,由于我们知道现有数组已排序,因此我们知道该数组通常如下所示:
[元素<x] [元素> x]
我们通过在数组末尾创建一个空洞开始算法:
[elements <x] [elements> x] [空Kong]
现在,我们希望最后对所有n个元素完全对数组进行排序,因此警报阅读器可能会意识到在完成此步骤后,数组必须看起来像这样:
[elements <x] [x] [elements> x]
因此,所有大于x的元素都必须向下移动数组一个插槽。 实际上,只要a [j]大于x,就可以通过将任何元素a [j]移到a [j + 1]来非常简单地做到这一点。 我们从Kong之前的元素开始移动,并继续直到我们检查的元素小于x。 现在,每个元素都已移动一个插槽,并覆盖了每个先前复制的值(最后一个要移动的值除外),其中最后一个要移动的值彼此相邻。 我们知道该元素大于x(否则我们将不会移动它),因此我们将x放置在元素最初保持的位置。
此算法有力的说明是,可以将其实现为不占用额外空间。 如果我们仅将任何数组的第一个I元素视为已排序的数组,那么创建一个Kong就像增加数组的大小,制作最后一项的副本(必须将其插入其已排序的位置)并跟随我们的数组一样简单以上步骤。 伪代码算法如下所示:
void insertion_sort(int[] array) {
for (Loop i from 1 to array.size-1)
int x = array[i]
int j = array[i-1]
while (j >= 0 && array[j] > x)
array[j+1] = array[j]
j = j - 1
array[j+1] = x
}
翻译自: https://bytes.com/topic/java/insights/737254-insertion-sort
插入排序算法