您的位置:首页 > Web前端 > JavaScript

常见的排序方法(javascript)

2017-08-22 15:18 190 查看

冒泡排序

重复的走访过要排序的数列,一次比较两个元素,如果顺序错误就交换过来。

这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

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,所以必定为最小的,此时le
4000
ft不需要再执行排序。

right中第一项为5,其余的都排到right数组中。此时right为[12,8,19,21,15];

以此类推。

(后续再补充~) (≡ω≡.)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: