JavaScript --数据排序算法(2)
选择排序
算法思想:从所有记录中选出最小的一个数据元素与第一个位置的记录交换;
然后在剩下的记录当中再找最小的与第二个位置的记录交换,循环到只剩下最后一个数据元素为止。
---上代码----
let arrTemps = [3, 2, 11, 9, 2, 15, 19, 19, 16, 1, 8]
function select(arr) {
var currentIndex; //当前记录的初始位置
var temp; //换值容器
var len = arr.length;
for (var i = 0; i < len; i++) {
currentIndex = i //默认是最外层的
for (var j = i + 1; j < len; j++) {
if (arr[j] < arr[currentIndex]) {
// 将记录的值 再依次进行对比 确认出最小值的位置并记录
// 如果要更换成降序的话 换成大于即可
currentIndex = j
}
}
// 交换位置
// 将最外层的循环的值 与对比获取的位置进行交换
temp = arr[i]
arr[i] = arr[currentIndex]
arr[currentIndex] = temp
}
return arr
}
console.log(select(arrTemps), '选择排序');
这个有点类似冒泡排序,冒泡排序是相邻的比较,选择排序是在当前位置与后面的所有进行比较取出当前的最大值/最小值
插入排序
算法思想:从待排序的n个记录中的第二个记录开始,依次与前面的记录比较并寻找插入的位置, 每次外循环结束后,将当前的数插入到合适的位置。
---上代码----
let arrTempsp = [2, 3, 11, 9, 2, 15, 19, 19, 16, 1, 8]
function insert(arr) {
for (let i = 0; i < arr.length; i++) {
let item = arr[i]; //当前对比的值
let j = i - 1 //往当前位置前一位的位置
while (arr[j] > item) {
//升序
// 要插入的值 进行对比 大于的话 直接交换位置,整体向右移位
//降序 换成 小于
arr[j + 1] = arr[j];
j--; //记录当前位置往前
}
// 插入记录位置的后一位索引
arr[j + 1] = item
}
return arr
}
console.log(insert(arrTempsp), '插入排序');
插入排序是从第二个起,每次都是往前进行查找相应的位置进行插入,有点类似于来一个元素 在之前排好的元素中进行插入
归并排序
算法思想:将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并
---上代码----
let arrTe = [2, 3, 11, 9, 2, 15, 19, 19, 16, 1, 8]
function merge(arr) {
if (arr.length <= 1) { //使用递归的,结束条件
return arr
}
let mid = Math.floor(arr.length / 2)
let left = merge(arr.slice(0,mid)) //进行递归二分,形成最小的单元
let right = merge(arr.slice(mid)) //进行递归二分
console.log(left,right);
// 排序 最小单元是数组的形式
function sort(left,right){
let result=[]
while(left.length>0&&right.length>0){
// 对比数组的第一个 小的那个数组截取第一个 添加到result中
// 直至一个数组为空 跳出循环
if (left[0]>right[0]) {
result.push(left.shift())
}else{
result.push(right.shift())
}
}
// result是排序好的单元,在left 或right中存在一个最大值 需要拼接在一起
return [...result,...left,...right]
}
return sort(left,right)
}
console.log(merge(arrTe), '归并排序');
归并排序有点像快速排序,进行二分的 递归的形式,实现最小单元的排序,最终合并成。
小编用的相对比较多的还是前面的两种--冒泡排序和快速排序