冒泡排序:通过交换紧挨的两个元素位置将数组中最大或者最小的浮到数组最前或最后面。
伪代码
function bubbleSort(arr) {
if (!(arr instanceof Array)) {
alert("排序对象未定义或不是数组");
} else {
//长度不变,长度存为常量,有块级作用域
const arrLen = arr.length;
//遍历arrLen - 1轮,每轮选出一个最大值或者最小值,如果从0开始就是小于arrLen-1
for (let i = 1; i < arrLen; i++) {
//每轮从第0个开始与下一个元素比较,选出本轮最大值或者最小值放在数组末端,其中arrLen-i为本轮比较的次数。
//如果大于交换两个元素,那就是选出最大值,即升序;如果是小于交换,就是选出最小值,即降序。
//如果从后往前遍历,选出的最大值或者最小值放在数组的最前面,即j=arrLen j>arrLen-i j--
for (let j = 0; j < arrLen - i; j++) {
if (arr[j] > arr[j+1]) {
//交换两个元素位置
const temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
}
插入排序:将数组逻辑上分为待排序和已排序数组,遍历待排序数组的每个元素,将该元素插入到已经排序的数组里,要插入元素介于大于和小于该元素之间。
伪代码
function insertSort(arr) {
if (!(arr instanceof Array)) {
alert("排序对象未定义或不是数组");
} else {
const arrLen = arr.length;
//i从1开始,往后遍历每个元素,往前插入已排序列表
//跑n-1轮,每轮确定一个元素要插入的位置
for (let i = 1; i < arrLen; i++) {
//将要插入的元素保存为常量
const insertValue = arr[i];
//j指向已经排序列表从后往前遍历
let j = i - 1;
//如果要插入的元素小于已经排序的数组里的值
//将已排序数组的值往后移动一位
for (; j >= 0 && insertValue < arr[j]; j--) {
arr[j+1] = arr[j];
}
/*while(j >= 0 && arr[j] > insertValue) {
arr[j+1] = arr[j];
j--;
}*/
//将要插入的元素放到最后空出的这个元素上
arr[j+1] = insertValue;
}
}
}
选择排序:遍历数组选出最大值或者最小值放到最后面或者最前面
和冒泡排序的区别是,冒泡排序是交换相邻两个元素,选择排序是记录最大或最小值与最后面或者最前面元素交换
伪代码
function selectSort(arr) {
if (!(arr instanceof Array)){
alert("排序对象未定义或不是数组");
} else {
const arrLen = arr.length;
//循环n-1轮,每轮选出一个最大值或者最小值
for (let i = 1; i < arrLen; i++) {
//max选择第0个元素,也可以随机选
let maxValue = arr[0];
let maxIndex = 0;
//从第一个元素开始往后遍历
//如果当前元素大于最大值,将当前元素的值和索引赋值给最大值和最大值索引
//比较n-i次,选出未排序中的最大值与最后面的元素进行交换
let j = 1;
for (; j <= arrLen-i; j++) {
if (arr[j] > maxValue) {
maxValue = arr[j];
maxIndex = j;
}
}
const temp = arr[maxIndex];
arr[maxIndex]= arr[j-1];
arr[j-1] = temp;
}
}
}