冒泡排序
原理:相邻的两个数作比较,前者比后者大就调换位置,依次类推,直到所有数字都升序排列。每一轮循环都会找到当前循环的最大值放在数组的最后面。
/* 随便定义一个数组 */
var arr = [2, 8, 5, 23, 6, 3, 66, 31];
/* n个数字只需要比较n-1次 */
for (var i = 0; i < arr.length - 1; i++) {
/* 用 arr[j]>arr[j+1] 在比较倒数第二位的时候已经获取到了倒数第一位,所以循环次数可以减
一次,而且每轮循环都会找出一个最大值,所以当前循环找到的最大值在下一轮可以不参与比较 */
for (var j = 0; j < arr.length - 1 - i; j++) {
/* 当前位和下一位比较,若前者比后者大就调换位置 */
if (arr[j] > arr[j + 1]) {
/* 定义一个中间变量当中间存储容器 */
var middle = 0;
middle = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = middle;
}
}
}
console.log(arr);
选择排序
原理:定义一个容器来装最小值的下标,默认从第一位开始,依次向后寻找,一次循环之后会找出一个最小数放在数组的开头。
/* 随便定义一个数组 */
var arr = [2, 8, 5, 23, 6, 3, 66, 31];
/* n个数字只需要比较n-1次 */
for (var i = 0; i < arr.length - 1; i++) {
/* min用来装最小数的下标,默认第一位为最小数 */
var min = i;
/* 起始位置为min的后一位,与arr[min]比较 */
for (var j = i + 1; j < arr.length; j++) {
/* 如果找到了新的最小的数,就让min存该数的下标 */
if (arr[min] > arr[j]) {
min = j;
}
}
/* 如果min不是当前循环的第一位的下标,就交换第一位数和当前下标为min的数 */
if (min != i) {
var middle = 0;
middle = arr[min];
arr[min] = arr[i];
arr[i] = middle;
}
}
console.log(arr);
总结:选择排序相比冒泡排序效率更高一点,因为不用每次判断就触发条件交换数值,而是等一次循环完再交换数值,省去交换数值的过程。