插入排序
首先第一个数是排好序的,然后将第二个数插入到第一个数,这样第一,第二这个两个数组成的子数组就是排序好的,接着在将第三个数插入到这个数组中,依次插入…到最后这个数组就行排序的
Code
// 插入排序
function insertSort(arr){
for (let i=1; i<arr.length; i++){
let temp = arr[i];
let j = i-1;
while (j>=0 && temp < arr[j]){
arr[j+1] = arr[j];
j--;
}
arr[j+1] = temp;
}
return arr;
}
希尔排序(不稳定)
首先对数组进行分组,根据step进行分组,然后对组内的元素进行排序,通常step取为数组长度的一半,下一次分组的step就是step/2…直到step===1,直接排序:在比较个数少且基本有序时,效率高,而希尔排序,进行分组,减少了比较次数,且最后一个step===1,其实就是一次插入排序,但是此时数组基本有序,所以希尔排序效率更高。
function shellSort(arr){
for (let step = Math.floor(arr.length/2); step >= 1; step=Math.floor(step/2)){
// 对每个分组进行组内排序(直接插入排序)
// 注意这里是交替对每个分组进行组内排序的
// 若原数组:13 27 49 55 04 49 38 65 97 76
// step = 2:
// 分组为: 13 49 04 38 97
// 27 55 49 65 76
// 交替的意思就是先对13 49进行排序,然后对27 55进行排序,
// 接着对13 49 04进行排序,然后对27 55 49进行排序...类推到最后,为两个分组,且有序
for (let i=step; i<arr.length; i++){
let temp = arr[i];
let j = i;
for (; j>=0; j-=step){
if (temp >= arr[j-step]){
break;
}
arr[j] = arr[j-step];
}
arr[j] = temp;
}
}
return arr;
}