一. 简单插入排序
1.算法描述:
(1)从数组index=1开始,与左边进行比较,如果比左边的值小,左边的值在数组中右移一位
(2) 直至左边的值比该值大或者左边数组循环完毕,将该值插入
(3)数组其余元素依次循环执行上述的步骤
2.算法实现:
function insertSort(arr){
//从index=1开始逐个插入
for(let i=1;i<arr.length;i++){
//放置arr[i]被覆盖掉
let temp=arr[i]
for(let m=i-1;m>=0;m--){
if(arr[m]>temp){
arr[m+1]=arr[m]
}else{
arr[m+1]=temp;
break;
}
}
}
return arr
}
3.算法分析
最优时间复杂度:O(n)
最差时间复杂度:O(n的平方)
平均时间复杂度:O(n的平方)
空间复杂度: O(1)
稳定性:稳定(小于等于的时候插入后面)
二.希尔排序
1.算法描述
在简单的插入排序算法上添加了gap(间隔),循环递减这个间隔直至为1
2.算法实现
function shellSort(arr){
//确定初始的gap的值
let gap=Math.floor(arr.length/2);
//循环gap直至为1
for(let i=gap;i>=1;i=Math.floor(i/2)){
//进行简单插入排序
for(let m=i;m<arr.length;m++){
let temp=arr[m];
for(let n=m-i;n>=0;n=n-i){
if(arr[n]>temp){
arr[n+i]=arr[n];
}else{
arr[n+i]=temp;
break;
}
}
}
}
return arr;
}
3.算法分析
最优时间复杂度:O(n)
最差时间复杂度:O(n的平方)
平均时间复杂度:O(n的1.3次方)
空间复杂度: O(1)
稳定性:不稳定(多次进行插入排序,导致数据位置发生改变)