插入排序:
思想:
每次将关键字插入到已经排好序的子集中
空间复杂度:O(1);
时间复杂度:最好,已经排序好的:O(n)
最坏,逆序:O(n^2)
则平均为:O(n^2)
稳定性:稳定
实现:
charuSort(){
var a = [53, 17, 78, 9, 45, 65, 87, 32];
// 每次将关键字插入到排好的子集中
for (let i = 1;i<a.length;i++) {
if (a[i]<a[i-1]){ // 只有当前元素比上一个元素小的时候才进行元素的移动,所以要先判断大小
let temp = a[i]
for (var j =i-1;j>=0 && temp<a[j];j--) {
a[j+1] = a[j] // 所有大于temp的元素都向后移动
}
a[j+1] = temp // 因为j 一直在 -- 所以这里是a[j+1] = temp
}
}
},
带哨兵,相当于将a[0]空出来,元素从1-len
然后用a【0】替换temp
而且优点是,不用每轮循环都判断是否大于0
for (var j =i-1;j>=0 && temp<a[j];j–)
for (var j =i-1;&& a[0]<a[j];j–)
charuSort(){
var a = [53, 17, 78, 9, 45, 65, 87, 32];
// 每次将关键字插入到排好的子集中
for (let i = 2;i<=a.length;i++) {
if (a[i]<a[i-1]){ // 只有当前元素比上一个元素小的时候才进行元素的移动,所以要先判断大小
a[0] = a[i]
for (var j =i-1;&& a[0]<a[j];j--) {
a[j+1] = a[j] // 所有大于temp的元素都向后移动
}
a[j+1] = a[0] // 因为j 一直在 -- 所以这里是a[j+1] = a[0]
}
}
},
优化:
折半查找
思想:先用折半查找,找到需要插入的位置,再进行插入,当low>high时,停止折半查找,然后将【low,i-1】全部右移动,将temp复制到low的位置;
当关键字与min所指的值相等时,为保证算法稳定性,防止后面还有相等的值,则不停止折半查找,继续再右边进行查找
charuSort(){
var a = [53, 17, 78, 9, 45, 65, 87, 32];
let low,high,mid;
// 每次将关键字插入到排好的子集中
for (let i = 1;i<a.length;i++) {
let temp = a[i];
low = 0;
high =i;
while (low <=high) {
mid = (low+high)/2;
if (a[mid] >temp){ // 判断大小,判断需要插入的位置再左表还是右表
high = mid - 1; // 左表
} else {
low = mid +1; // 右表
}
}
for (var j =i-1;j>=high;j--) {
a[j+1] = a[j] // 所有大于temp的元素都向后移动
}
a[high+1] = temp // 因为j 一直在 -- 所以这里是a[j+1] = temp
}
},