直接插入排序:把数组分为已排序和未排序两部分,把未排序的元素一次一个插入到已排序部分的合适位置上。已排序部分逐渐增大,直到整个数组变成有序的。
设数组为a[n]。
1.初始时,a[0]自成1个有序区,无序区为a[1]、a[2]...a[n-1]。令i=1
2.将a[i]并入当前的有序区a[0]、a[1]...a[i-1]中形成a[0]、a[1]...a[i]的有序区间。
3.i++并重复第二步直到i==n-1。排序完成。
下面通过一个例子来说明这个排序流程:
待排序列: 49, 38 , 65 , 97, 76 , 13, 27 ,49
插入49: 49
插入38: 38, 49
插入65: 38, 49, 65
插入97: 38, 49, 65, 97
插入76: 38, 49, 65, 76, 97
插入13: 13, 38, 49, 65, 76, 97
设数组为a[n]。
1.初始时,a[0]自成1个有序区,无序区为a[1]、a[2]...a[n-1]。令i=1
2.将a[i]并入当前的有序区a[0]、a[1]...a[i-1]中形成a[0]、a[1]...a[i]的有序区间。
3.i++并重复第二步直到i==n-1。排序完成。
下面通过一个例子来说明这个排序流程:
待排序列: 49, 38 , 65 , 97, 76 , 13, 27 ,49
插入49: 49
插入38: 38, 49
插入65: 38, 49, 65
插入97: 38, 49, 65, 97
插入76: 38, 49, 65, 76, 97
插入13: 13, 38, 49, 65, 76, 97
插入27: 13, 27, 38, 49, 65, 76, 97
插入49: 13, 27, 38, 49, 49, 65, 76, 97
<script>
function insertSort(arr){
var len=arr.length;
var temp,i,j;
for(i=1;i<len;i++){
temp=arr[i]; //暂时保存待插入元素
for(j=i-1;j>=0;j--){
if(temp<arr[j]){
arr[j+1]=arr[j]
}
else{
break;
}
}
arr[j+1]=temp;
}
}
var arr=[49,38,65,97,76,13,27,49];
insertSort(arr);
alert(arr);
</script>
上面实现的思路是:每次带插入元素a[i]先和已排序列中最后一个元素a[i-1]进行比较,如果a[i]>a[i-1],则直接把a[i]放在已排序列的末尾就行,无需调整,否则就令j=i-1,temp=a[i]。然后一边将数据a[j]向后移动一边向前搜索,当有数据a[j]<a[i]时停止并将temp放到a[j + 1]处。