所以我猜它是因为它只是比较A [k]和A [k-1],并且在一次扫描中执行但仍然不清楚。有人可以更好地解释。 感谢
答案 0 :(得分:1)
您回答了自己的问题:对于近似排序的数组,插入排序只需要少量O(n)
次传递即可完成。与分割和征服排序算法(如合并排序)形成对比,后者需要O(n*lgn)
。对于n
的任何非平凡值,分而治之算法将需要许多O(n)
次传递,即使数组几乎完全排序,而插入排序可能只需要少量。
答案 1 :(得分:0)
此link显示了具有不同类型数据集的排序算法的图形表示。 如您所见,当数据被排序时,算法复杂度降低到N.这相当于作为输入的元素数量。
提供的链接清楚地说明了它的效率如何。
答案 2 :(得分:0)
排序算法的一般目标是最小化比较次数。排序算法具有下限和比较数量的上限(n log n
最坏情况下的合并和堆排序,n log n
平均情况下快速排序)。在最常见的情况下,您使用的算法恰好具有最佳平均或最差情况下的比较次数。但是,当您对数据有所了解时(例如,数组已经排序或几乎已排序),您可以利用插入排序的下限远低于" {{1}的事实。 }"排序
例如,如果你有一个数组[1,2,3,4,5,6,7,9],你需要在其中插入8,你可以在最后插入它,并对数组进行排序使用vanilla n log n
排序(将进行大约28次比较(粗略地)将数据排序为[1,2,3,4,5,6,7,8,9])。但是,插入排序允许您仅在大约8次比较中将8插入到正确的位置。
答案 3 :(得分:0)
插入排序是一种比选择排序更快,更改进的排序算法。在选择排序中,算法通过每次传递迭代所有数据,无论它是否已经排序。但是,插入排序的工作方式不同,而不是在每次传递后迭代所有数据,算法只遍历所需的数据,直到排序的段被排序。同样,插入排序需要两个循环,因此有两个主要变量,在这种情况下命名为' i'和' j'。变量' i'和' j'在第一个循环的每次传递后开始于相同的索引,第二个循环仅在变量' j'大于索引0和arr [j]< arr [j - 1]。换句话说,如果' j'还没有到达数据的末尾和索引的值,其中' j' at at小于' j'左边索引的值,最后' j'减少了。只要在第二个循环中满足这两个条件,它就会继续执行,这就是将插入排序与选择排序区分开来的原因。只对需要排序的数据进行排序。