1、冒泡排序
// 冒泡排序 将数组中相邻的两个元素之间进行大小比较,然后决定是否进行位置交互
var arr = [5, 4, 2, 3, 8];
// /*
// 第一次 5与4比较 交互位置[4,5,2,3,8]
// 第二次 5与2比较 交换位置[4,2,5,3,8]
// 第三次 5与3比较 交互位置[4,2,3,5,8]
// 第四次 5与8比较 不交换 [4,2,3,5,8]
// */
// // 当i等于4的时候 使用arr[4]与arr[5]比较 越界
// for (var i = 0; i < arr.length - 1; i++) {
// // 每次循环arr[i] 表示当前比较的前面的一个元素 arr[i+1] 表示比较的后面一个元素
// if (arr[i] > arr[i + 1]) {
// // 前面的数字大 需要交换位置
// var tmp = arr[i];
// arr[i] = arr[i + 1];
// arr[i + 1] = tmp;
// }
// }
// console.log(arr)
/*
第一轮
第一次 5与4比较 交互位置[4,5,2,3,8]
第二次 5与2比较 交换位置[4,2,5,3,8]
第三次 5与3比较 交互位置[4,2,3,5,8]
第四次 5与8比较 不交换 [4,2,3,5,8]
完成一次所有相邻的元素进行大小比较之后 只能确定一个最大值。所以需要将上面的操作在来几次
第二轮
第一次 4与2比较 交换位置 [2,4,3,5,8]
第二次 4与3比较 交换位置 [2,3,4,5,8]
第三次 4与5比较 不交换
完成了第二个最大值的查找
....
轮数 根据数组的元素个数-1
*/
2
var count = 0;
for (var j = 0; j < arr.length - 1; j++) {
// 当j = 0 第一轮比较 需要比较4次
// 当j = 1 第二轮比较 需要比较3次
for (var i = 0; i < arr.length - j - 1; i++) {
count++;
// 每次循环arr[i] 表示当前比较的前面的一个元素
arr[i+1] 表示比较的后面一个元素
if (arr[i] > arr[i + 1]) {
// 前面的数字大 需要交换位置
var tmp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = tmp;
}
}
}
console.log(arr)
console.log('一共进行了' + count + '次比较')
2、选择排序
/*
先假设 第一个元素最小 在使用假设的最小值与后面的每一个元素进行比较
第一轮 先假设下标为0的元素最小
第一次 使用5与6比较
第二次 使用5与3比较 记录现在最小值的小标为2
第三次 使用3与3比较
第四次 使用3与1比较 记录现在最小值的小标为3
第五次 使用1与8比较
第六次 使用1与7比较
第七次 使用1与2比较
第八次 使用1与4比较
使用下标为0的元素与下标为3的元素位置交互
[1,6,3,5,8,7,2,4]
第二轮 先假设下标为1的元素最小
第一次比较
。。。。
最后 找到 下标为6的元素是最小值 使用下标为1的与下标为6的进行交互
[1,2,3,5,8,7,6,4];
。。。
*/
var arr = [5, 6, 3, 1, 8, 7, 2, 4];
for (var j = 0; j < arr.length; j++) {
// j = 0 第一轮 假设下标为0的元素最小
// j = 1 第二轮 假设下标为1的元素最小。。。。
// 表示假设的最小值的下标
var index = j;
for (var i = index + 1; i < arr.length; i++) {
// arr[index]>arr[i]满足比较假设不成立 当前i的元素是最小值
arr[index] > arr[i] && (index = i)
}
var tmp = arr[index];
arr[index] = arr[j];
arr[j] = tmp;
}
console.log(arr)
3、数组sort方法排序
语法 数组.sort(匿名函数) 默认是按照字符串的ASCII进行排序
// 匿名函数中存在2个形参 表示比较的两个元素 函数体return a-b 就是从小到大 函数体中return b-a 就是从大到小
arr = [10, 9, 28, 65];
arr.sort(function (a, b) {
// return a-b
return b - a
});
console.log(arr) //[65,28,10,9]
4、快速排序
function quickSort(arr) {
if (arr.length <= 1) return arr;
var centerIndex = ~~(arr.length / 2);
var left = [];
var right = [];
for (var i = 0; i < arr.length; i++) {
if (i === centerIndex) continue;
if (arr[i] < arr[centerIndex]) left.push(arr[i]);
else right.push(arr[i]);
}
return quickSort(left).concat(arr[centerIndex], quickSort(right));
}