冒泡排序
重复的走访过要排序的数列,一次比较两个元素,如果顺序错误就交换过来。
这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
let arr = [3,12,5,8,19,21,1,15];
for (let i = 0; i < arr.length - 1; i++) {
for (let j = 0; j<arr.length - 1 - i; j++){
if (arr[j] > arr[j+1]) {
let temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
步骤:
最外层的循环次数和数组长度相等。第一次循环,所有项两两对比,数组中最大的数字被放到最后。
第一次比较结果:
[3,12,5,8,19,1,15,21];
因为最大数字被选出,所以最后一个数字不用进入比较,第二轮,从第一项比较到倒数第二项。
第二次比较结果:
[3,12,5,8,1,15,19,21];
以此类推比较到最后得出结果。
因为每次比较都能把最大的移到后面,所以内层的循环每次都减去i,因为i等于进行了几次比较,已经有多少确定的数字被移动到了最后。
插入排序
对于未排列数据,在已排序序列中从后向前扫描,找到相应的位置并插入。
let arr = [3,12,5,8,19,21,1,15];
for (let i = 1; i < arr.length; i++){
for (let j = 0; j < i; j++){
if(arr[j] > arr[i]){
arr.splice(j, 0, arr[i]);
arr.splice(i+1, 1);
}
}
}
步骤:
最外层循环次数和数组长度相同。i=1时,内层循环进行1次,即j为0,第一项和第二项比较,如果第一项大于第二项,在j的位置,即第一项的位置插入i的数字,即第二项,再删除i位置本身的数字。
i=2时,第一项,第二项都与第三项比较,比第三项大就执行操作。
第二项大于第三项:
//先插入元素
[3,5,12,5,8,19,21,1,15]
//再删除元素
[3,5,12,8,19,21,1,15]
后面以此类推,每一层循环,都把最大的往后换。
我觉得这个就是把后面的数据,一个个去对比放到前面的哪个位置比较好,再进行替换。
快速排序
通过一次排序将要排序的数据分割成两部分,左边的部分小于右边的部分,再按此方法继续排序。
Array.prototype.quick_sort = function() {
var len = this.length;
if(len <= 1){
return this.slice(0);
}
var left = [];
var right = [];
var mid = [this[0]];
for (var i = 1; i < len; i++) {
if (this[i] < mid[0]){
left.push(this[i]);
}else{
right.push(this[i]);
}
}
return left.quick_sort().concat(mid.concat(right.quick_sort()));
}
let arr = [3,5,12,8,19,21,1,15];
arr = arr.quick_sort();
步骤:
将数组的第一项作为基准项,所有比基准项小的排在左边,比基准项大的排在右边。此时left为[1],right为[5,12,8,19,21,15];
left因为长度为1,所以必定为最小的,此时left不需要再执行排序。
right中第一项为5,其余的都排到right数组中。此时right为[12,8,19,21,15];
以此类推。
(后续再补充~) (≡ω≡.)