原理
1 元素依次比较大小, 按条件交换位置
2 交换过位置的元素, 往回与之前的元素比较大小, 找到插入的位置,直到不符合交换位置的条件.跳出循环
3 继续外层循环
var arr = [ 0, 0, 1, 2, 3, 4, 5, 6, 12, 22, 123, 333, 333, 444, 555, 666, 777, 888, 999];
function insterSort(arr) {
var arrLenght = arr.length;
var countAll = 0;
var swapAll = 0;
function swap(arr, n1, n2) {
if(arr[n1] > arr[n2]){
[arr[n1], arr[n2]] = [arr[n2], arr[n1]];
swapAll += 1;
return true;
}
return false;
}
for(let i = 0; i < arrLenght; i++){
var index = i;
//内层循环 往回和之前的元素比较大小
while(swap(arr, index, index-1)){
index--;
countAll +=1;
}
}
console.log('swapAll: ' + swapAll);
console.log('forLoop: ' + countAll);
return arr;
}
console.log(insterSort(arr));
swapAll: 169
forLoop: 169
[ 999, 888, 777, 666, 555, 444, 333, 333, 123, 22, 12, 6, 5, 4, 3, 2, 1, 0, 0 ]
下面是简洁版:
var arr = [0, 1, 2, 5, 10, 12, 22, 50, 91, 123, 300, 444, 500, 666, 999, 1000, 1010]
, count = 0;
function insterSort(arr) {
let arrLen = arr.length - 1;
for (let i = 0; i < arrLen; i++) {
let index = i;
while (arr[index] < arr[index + 1]) {
[arr[index], arr[index + 1]] = [arr[index + 1], arr[index]];
index--, count++;
}
}
return arr;
}
console.time('s');
var re = insterSort(arr);
console.timeEnd('s');
console.log(
re, count
);
s: 0.672ms
[ 1010, 1000, 999, 666, 500, 444, 300, 123, 91, 50, 22, 12, 10, 5, 2, 1, 0 ] 136
CPU i5-4590