一.插入排序的思路
插入排序思想的核心是局部有序
比如在一个队列中的队员,我们选择其中一个作为被标记的队员
这个被标记的队员左边的所有队员已经是局部有序的
这意味着在队列中,有一部分人是按顺序排好的,另一部分还没有顺序
- 从第一个元素开始,该元素可以认为是已经被排序
- 取出下一个元素,在已经排序的元素序列中从后向前扫描
- 如果该元素(已排序)大于新元素,将该元素移到下一位
- 重复上一步骤,直到找到已排序的元素小于或者等于新元素的位置
- 将新元素插入到该位置后,重复上面的步骤
二.插入排序的代码
ArrayList.prototype.insertionSort = function(){
var length = this.array.length
//外层循环:从第1个位置开始获取数据,向前面局部有序进行插入
for(var i = 1; i < length; i++){
var temp = this.array[i]
var j = i
//内层循环:获取i位置的元素,和前面的数据依次进行比较
while(this.array[j-1] > temp && j > 0){
this.array[j] = this.array[j-1]
j--
}
//将temp放置在j位置
this.array[j] = temp
}
}
三.插入排序的效率
- 插入排序的比较次数:
第一趟时,需要的最多次数是1,第二趟最多次数是2,依次类推;因此插入排序的最多次数是:N*(N-1)/2。然而每趟发现插入点之前,平均只有全体数据项的一半需要进行比较,所以平均比较次数为:N*(N-1)/4,相比于选择和冒泡排序,该排序方法的比较次数是少了一半的。 - 插入排序的复制次数:
第一趟时,需要的最多复制次数是1,第二趟最多复制次数是2,依次类推;因此插入排序的最多复制次数是:N*(N-1)/2。
平均次数为N*(N-1)/4
该算法的效率是高于选择和冒泡排序的