直接插入排序
英勇青铜
算法思路
两个数组:待排序数组
disorderArray
和有序数组orderArray
从待排序数组中取一个数disorderArray[i]
依次和有序数组中每个数比较
小于元素orderArray[j]
时
先将位置j
及之后的元素向后移动一位
再插入到位置j
上
一直都不小于,
则直接插入到orderArray[orderArray.length]
上
注意
disorderArray[i]
和orderArray[j]
比较时:
从左向右,条件disorderArray[i]<orderArray[j]
从右向左,条件disorderArray[i]>orderArray[j]
如果加上等于,可以少比较一次,但是要多做一次移动
算法实现
function InsertSort(disorderArray) {
var i, j, k;
var orderArray = [];
//第0个元素不用排序
orderArray[0] = disorderArray[0];
//从第1个元素开始,依次取出待排序数组中的元素
for (i = 1; i < disorderArray.length; i++) {
//依次和有序数组元素比较
for (j = 0; j < orderArray.length; j++) {
//小于等于元素,则找到了要插入的位置orserArray[j]
if (disorderArray[i] < orderArray[j]) {
break;
}
//如果j == orderArray.length,那么disorderArray[i]是最大的
//直接插入到j位置,不用再移动orderArray
}
//将位置j及之后的元素后移一位,j == orderArray.length时正好跳过循环
for (k = orderArray.length; k > j; k--) {
//有序数组会增1,从length+1开始从后向前到j插入到j+1
orderArray[k] = orderArray[k - 1];
}
//插入到合适的位置
orderArray[j] = disorderArray[i];
}
console.log(orderArray);
}
var disorderArray = [5, 3, 8, 1, 6, 4];
InsertSort(disorderArray);
不屈白银
算法思路
一个数组:
orderArray
首先将orderArray[0]
看成有序数组
然后从orderArray[1]
开始插入到有序数组中
目标就是将待排部分全部插入到有序部分
算法实现
function InsertSort(orderArray) {
//辅助交换
var temp;
//依次取出待排序部分的元素orderArray[i],从1开始
for (var i = 1; i < orderArray.length; i++) {
//待排部分和有序部分从右向左进行比较
for (var j = i - 1; j >= 0; j--) {
//待排元素大于则插入,找到要插入的位置j+1
if (orderArray[i] >= orderArray[j]) {
break;
}
}
temp = orderArray[i];
//待排元素位置到插入位置之间的元素需要移动
for (i; i > j + 1; i--) {
orderArray[i] = orderArray[i - 1];
}
orderArray[j + 1] = temp;
}
}
var orderArray = [9, 3, 7, 1, 4, 2, 5, 0, 6, 8]
InsertSort(orderArray);
console.log(orderArray);
荣耀黄金
算法思路
待排部分和有序部分比较时
若待排元素小于有序元素,则将有序元素后移
若待排元素大于等于有序元素,则待排元素位置确定,插入该位置
跳出此次循环
目标任然是将待排元素插入到有序部分
注意
比较条件写到
for
循环中
function InsertSort(orderArray) {
//辅助交换
var temp;
//依次取出待排序部分的元素orderArray[i],从1开始
for (var i = 1; i < orderArray.length; i++) {
temp = orderArray[i];
//待排部分和有序部分从右向左进行比较
for (var j = i - 1; j >= 0 && temp < orderArray[j]; j--) {
//待排元素小于则后移
orderArray[j + 1] = orderArray[j];
}
//待排元素插入
orderArray[j + 1] = temp;
}
}
var orderArray = [9, 3, 7, 1, 4, 2, 5, 0, 6, 8]
InsertSort(orderArray);
console.log(orderArray);
华贵铂金
算法思路
待排部分和有序部分比较时
若待排元素小于有序元素,则两者进行位置交换,继续比较
若待排元素大于等于有序元素,则待排元素位置确定,跳出此次循环
目标任然是将待排元素插入到有序部分
注意
每次只是进行两个元素的比较
其中一个是待排元素
这种方式可能不是直接插入排序
算法实现
function InsertSort(orderArray) {
//辅助交换
var temp;
//依次取出待排序部分的元素orderArray[i],从1开始
for (var i = 1; i < orderArray.length; i++) {
temp = orderArray[i];
//待排部分和有序部分从右向左进行比较
for (var j = i - 1; j >= 0; j--) {
//待排元素小于则交换位置
if (temp < orderArray[j]) {
orderArray[j + 1] = orderArray[j];
orderArray[j] = temp;
} else {
break;
}
}
}
}
var orderArray = [9, 3, 7, 1, 4, 2, 5, 0, 6, 8]
InsertSort(orderArray);
console.log(orderArray);