js实现八大排序
八大排序
这里的八大排序都是内部排序,即使用内存进行排序。
1、插入排序——直接插入排序
(1)基本思想
a、先将待排序序列的第1个元素看成是一个有序的子序列;
b、从第2个元素开始,逐个将待排序的元素x与已排序序列[i-1] ~[0](从后往前)进行比较;
c、若x小于比较元素,则比较元素向后移动一位;否则,将x插入序列当前位置。
(2)演示示例
(3)js实现
function insertSort(arr){
//第一层循环:遍历待比较的数组元素
for(let i = 1; i < arr.length; i++){
let temp = arr[i];
//第二层循环:将本轮带比较的元素与已经排序的元素相比较
for(var j = i - 1; j >= 0 && arr[j] > temp; j--){
arr[j + 1] = arr[j];
}
//将插入元素插入到正确位置
arr[j + 1] = temp;
}
return arr;
}
console.log(insertSort([1,5,3,7,2,8])); //(8) [2, 3, 4, 5, 7, 7, 8, 10]
2、插入排序——希尔排序(最小增量排序)
(1)基本思想–直接插入排序的改进
a、先将要数组按某个增量d(n/2,n为要排序数的个数)分成若干组,所有距离为d的倍数的记录放在同一个组中;在各组内进行直接插入排序;
b、然后再用一个较小的增量(d/2)对它进行分组,每组再进行直接插入排序;直至增量减为1,进行直接插入排序后,整体排序完成。
(2)演示示例
(3)js实现
需要三层循环遍历
function shellSort(arr){
let n = arr.length,
d = n;
//第一层循环:分割增量d
while(d > 1){
d = Math.floor(d/2);
//下面;两层循环是直接插入排
for(var i = d; i < n; i++){
//记录待比较的元素
var temp = arr[i];
for(var j = i - d; j >= 0 && arr[j] > temp; j = j -d){
arr[j + d] = arr[j];
}
arr[j + d] = temp;
}
}
return arr;
}
console.log(shellSort([1,5,3,7,2,8]));
3、选择排序——简单选择排序
(1)基本思想——比较+交换
每次遍历找到待排序元素中的最小值,将最小值和待排序的第一个元素交换,直至排序结束。
(2)演示示例
(3)js实现
function directSelectSort(arr){
let minIndex, temp;
for(var i = 0; i < arr.length; i++){
minIndex = i;
//找到最小的值
for(var j = i + 1; j < arr.length; j++){
if(arr[j] < arr[minIndex]){
minIndex = j;
}
}
//将最小的值与未排序的第一个元素进行交换
temp = arr[i