学飞了一周后,自己好吸收的 有冒泡,选择,插入和快排就迷迷糊糊的
冒泡
- 自己简单理解,每一次把最大的数弄到最后
- 边界值没冒一次就减少一个数的比较 所以就有了一下的代码
function srot(arr) {
for(let i = 0; i < arr.length - 1; i++) {
// 边界减少
for(let j = 0; j < arr.length - i - 1; j++) {
// 如果当前值比后边的值大则交换位置
if(arr[j] > arr[j+1]){
let temp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = temp;
}
}
}
return arr;
}
选择(简单排序)
- 线找到最小的或者最大的 起初这样写的
function deleNumber(val, arr){
for(let i = 0; i < arr.length ; i++){
if(arr[i] == val){
delete arr[i];
}
}
return arr.filter((item) => item);
}
function selectionSort2(arr){
let t = [];
while(arr.length){
let min = Math.min.apply('',arr);
arr = deleNumber(min,arr);
t.push(min);
}
return t;
}
后来学习后就可以不用api实现了
function sort(arr){
let minIndex; // 找到最小值
// 结束条件为啥是arr.length 因为 数组是从下标为0开始,所以实际长度为长度-1;
for(let i = 0; i < arr.length - 1; i++) {
minIndex = i;
// 第一个元素给了minIndex 所以 此处 为 i 的下一个元素
for(let j = i + 1; j < arr.length - 1; j++ ) {
if(arr[j] < arr[minIndex]){
// 记录最小的下标
minIndex = j;
}
}
// 这里 我老容易把 j 放过来。编译器报错,才意识到j在内循环的时候已经完成了它记录最小下表的使命了
let temp = arr[minIndex];
arr[minIndex] = arr[i];
arr[i] = temp;
}
return arr;
}
插入
- 从头到尾一次扫描插入到合适的位置 已经开始迷糊了
function insertionSort(arr){
let preIndex;
let current;
for(let i = 1 ; i < arr.length; i++){
preIndex = i - 1; // 记录游标位置
current = arr[i]; // 记录当前比较的值
// 此处条件有些难
while(preIndex >= 0 && arr[preIndex] > current){
// 使用游标交换
arr[preIndex+1] = arr[preIndex];
// 直到比较完
preIndex--;
}
arr[preIndex+1] = current;
}
return arr;
快排不行搞不定就是背也老是错东错西的。
有待日后提高