1、插入排序
步骤如下:
(1) 从第一个元素开始,该元素可以认为已经被排序
(2) 取出下一个元素,在已经排序的元素序列中从后向前扫描
(3) 如果该元素(已排序)大于新元素,将该元素移到下一位置
(4) 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
(5)将新元素插入到下一位置中
(6) 重复步骤2
具体实现如下,通过代码和注释(注释很多纯粹是为了帮助初学者了解)的结合可以更形象地展示算法的细节
var preIndex, current;
for (var i = 1; i < len; i++) {
// 记住i = 1,即从第二插起
preIndex = i - 1;
// 索引为长度-1,这是已排好的数组的最大一个(即最后一位)
current = arr[i];
// current代表要被插的数,其实从第二个元素插起
while(preIndex >= 0 && arr[preIndex] > current) {
// &&是与,即索引i-1>=0且索引i-1大于i(前一个元素大于后一个)。。=
arr[preIndex+1] = arr[preIndex];
// 前一个大于被插数,则将前一个往前挪
preIndex--;
// 即arr[i-2]是否大于i,如果是则继续while循环,继续往前挪,直到不符合whlie条件
// 换句话说,i和[1···i-1]都要比一次
}
// while完毕后,可以保证被插数插到了正确的位置(稳定的算法)
arr[preIndex+1] = current;
// preIndex+1是因为最后一个preIndex--后preIndex为负了,不能通过while循环条件
// 表明此时被插数已经插到了最前面[0]。
//具体过程举例如下:[5,6,7,8,1]将1插入,在while时的变化为[5,6,7,8,8],[5,6,7,7,8],[5,6,6,7,8],[5,5,6,7,8]
// 最后(preIndex--后)的值为-1
//arr[preIndex+1] = current;即arr[0]=current。将被插数赋值到正确的位置。
}
return arr;
}
2、冒泡排序
冒泡排序算法的运作如下:(从后往前)
(1)比较相邻的元素。如果第一个比第二个大,就交换他们两个。
(2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
(3)针对所有的元素重复以上的步骤,除了最后一个。
(4)持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
function bubbleSort(arr) {
var len = arr.length;
for (var i = 0; i < len; i++) {
// i的作用只是为了下面j < len - 1 - i,即不比已排好后的部分数
for (var j = 0; j < len - 1 - i; j++) {
// j < len - 1 - i代表以排好的元素就不管比了
// 这里最后是len - 1 - i和len-i比
// 每次j都要重新归零,是为了比较前面的数
if (arr[j] > arr[j+1]) { //相邻元素两两对比
var temp = arr[j+1]; //元素交换
arr[j+1] = arr[j];
// 还是把前一个赋值给后一个
arr[j] = temp;
}
}
}
return arr;
}