稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面;
不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面;
目录
一,插入排序
插入排序的基本思想是通过构建有序序列,将待排序的数据,在已排好序的序列中从后向前扫描,找到其相应位置并进行插入操作。通常采用申请一个辅助空间来记录当前待插入的记录,因此在从后向前扫描的过程中,需要反复把已经排序元素逐步向后挪位,为最新元素提供插入空间。
其中,插入排序主要包括直接插入排序(稳定),折半(二分法)插入排序(稳定),表插入排序,希尔排序(不稳定)。
直接插入排序:
希尔排序(不稳定排序)
其思想是:先将待排序序列分割为若干个子序列分别进行直接插入排序;待整个序列基本有序时,在对全体记录进行一次直接插入排序。
function shellSort(arr) {
for(let gap = Math.floor(arr.length/2); gap > 0; gap = Math.floor(gap/2)) {
// 内层循环与插入排序的写法基本一致,只是每次移动的步长变为 gap
for(let i = gap; i < arr.length; i++) {
let j = i;
let temp = arr[j];
for(; j> 0; j -= gap) {
if(temp >= arr[j-gap]) {
break;
}
arr[j] = arr[j-gap];
}
arr[j] = temp;
}
}
return arr;
}
var arr = [5,6,2,1,3,8,1,9,6,1]
document.write(shellSort(arr))
二,交换排序
交换排序的基本思想是通过两辆比较待排序记录的关键字,若不满足排序要求,则交换;不断重复比较和交换的过程,直到待排序记录满足排序要求为止。
冒泡排序(稳定):不停的比较相邻记录的关键字,如果不满足排序要求,就交换相邻记录,直到所有的记录都已经排好序为止。
使用了一个辅助空间