在b站看王红元老师的js算法教程后的笔记。
第一次写博客,写的不好、让您不明白的地方,还请见谅,并请移步b站观看详细教程。
b站搜索关键字后,有许多一样的教程,不知道哪个是官方的,就不放链接了。
冒泡排序
简单的说:就是循环比较相邻两元素的的大小,大的放后面,小的放前面。这样多次循环后就完成了排序。
详细说明:如果数组的第一个元素最大,怎么让他到最后最后一位呢。让它循环的与后一位的元素进行比较,如果比后一位大就换交换位置。因为它是最大的所以会一直交换位置到最后一位。这就确定了一个元素的位置。其他的每个元素也是这样,与后一个元素进行比较,大的放到后面,这样每比较一趟就能确定了一个元素的位置
let bubbleSort = function (array) {
for (let i = 0; i < array.length - 1; i++) {
for (let j = 0; j < array.length - i - 1; j++) {
if (array[j] > array[j + 1]) {
let item = array[j]
array[j] = array[j + 1]
array[j + 1] = item
}
}
}
return array
}
let array = [66, 88, 12, 87, 100, 5, 566, 23]
console.log(array) // [66, 88, 12, 87, 100, 5, 566, 23]
console.log(bubbleSort(array)) // [5, 12, 23, 66, 87, 88, 100, 566]
上面冒泡排序的代码您看懂了吗。如果您看懂了,感谢您的理解能力。 没有也没关系,请看下面的详细说明。
// 函数的参数是一个数组
let bubbleSort = function (array) {
// 第一层循环控制比较的趟数。每趟确定一个元素的位置(如果是5个元素,要比较4趟)
for (let i = 0; i < array.length - 1; i++) {
// 第二层循环控制每趟比较的次数。(如果是5个元素,第一趟比较4次,第二趟比较3次)
for (let j = 0; j < array.length - i - 1; j++) {
// 如果 某一个元素比 其后一位大。就让他们交换位置
if (array[j] > array[j + 1]) {
let item = array[j]
array[j] = array[j + 1]
array[j + 1] = item
}
}
}
return array // 返回 排序后的数组
}
let array = [66, 88, 12, 87, 100, 5, 566, 23]
console.log(array) // [66, 88, 12, 87, 100, 5, 566, 23]
console.log(bubbleSort(array)) // [5, 12, 23, 66, 87, 88, 100, 566]
选择排序
简单的说:就是循环找出最小的元素与前面的元素交换位置。这样多次循环后就完成了排序。
详细说明:声明一个变量number,先存储第一个元素的下标。循环遍历数组让每一元素与number元素比较。将较小元素的下标赋值给number。循环一次后number存储的就是最小元素的下标了。让number元素与第一个元素交换,这样就把最小元素放到最前面了。后面从第二个元素开始查找最小元素,找到后与第二个元素交换位置。以此类推。
let selectionSort = function (array) {
for (let i = 0; i < array.length - 1; i++) {
let number = i
for (let j = i + 1; j < array.length; j++) {
if (array[number] > array[j]) {
number = j
}
}
if (array[i] > array[number]) {
let item = array[i]
array[i] = array[number]
array[number] = item
}
}
return array
}
let array = [66, 88, 12, 87, 100, 5, 566, 23]
console.log(array) // [66, 88, 12, 87, 100, 5, 566, 23]
console.log(selectionSort(array)) // [5, 12, 23, 66, 87, 88, 100, 566]
上面的代码您看懂了吗。如果您看懂了,感谢您的理解能力。 没有也没关系,请看下面的详细说明。
let selectionSort = function (array) {
// 第一层循环控制 要确定的是那个位置元素(第一次要确定第一个位置的元素)
for (let i = 0; i < array.length - 1; i++) {
// 先存储当前位置,后面存储 找到的最小元素
let number = i
// 第二层循环查找 最小的元素(从i的后一位开始)
for (let j = i + 1; j < array.length; j++) {
// 如果 后面有比它小的元素
if (array[number] > array[j]) {
// 存储 找到的最小元素
number = j
}
}
// 交换 元素位置 (有可能第二层循环没找到最小元素 i == number。就不用交换)
if (array[i] > array[number]) {
let item = array[i]
array[i] = array[number]
array[number] = item
}
}
return array
}
let array = [66, 88, 12, 87, 100, 5, 566, 23]
console.log(array) // [66, 88, 12, 87, 100, 5, 566, 23]
console.log(selectionSort(array)) // [5, 12, 23, 66, 87, 88, 100, 566]
插入排序
先说一个概念局部有序:就是数组中从第一个元素开始有一部分元素是有序的。如:这个数组[4, 5, 7, 2, 9, 1]中的4, 5, 7元素,后面的2不是。或者,这个数组[7, 5, 4, 2, 9, 1]中的 7 元素(一个元素也能看成是有序的)。
简单的说:取出局部有序外的一个元素,与局部有序内的元素比较,找到一个合适的位置,然后插入。
详细说明:以这个数组为例[7, 5, 4, 2, 9, 1],先把7元素看成局部有序,取出局部有序外的一个元素5,与7进行比较。7比较大,就向右平移到5的位置上,把5插入到原来7的位置。数组变成了这样[5, 7, 4, 2, 9, 1],5, 7是局部有序的了。后面的元素循环上面的操作。
let bubbleSort = function (array) {
for (let i = 0; i < array.length - 1; i++) {
for (let j = 0; j < array.length - i - 1; j++) {
if (array[j] > array[j + 1]) {
let item = array[j]
array[j] = array[j + 1]
array[j + 1] = item
}
}
}
return array
}
let array = [66, 88, 12, 87, 100, 5, 566, 23]
console.log(array) // [66, 88, 12, 87, 100, 5, 566, 23]
console.log(bubbleSort(array)) // [5, 12, 23, 66, 87, 88, 100, 566]
上面的代码您看懂了吗。如果您看懂了,感谢您的理解能力。 没有也没关系,请看下面的详细说明。
let insertionSort = function (array) {
// 第一层循环查找 局部有序外的元素 (先把第一个元素看成局部有序,从第二个元素开始查找)
for (let i = 1; i < array.length; i++) {
// 取出 局部有序外的第一个元素 赋值给变量 temp
let temp = array[i]
// 用变量 j 存储 空位置的下标
let j = i
// 第二层循环查找 temp元素要插入局部有序内的位置
while (array[j - 1] > temp && j > 0) {
// 局部有序内比temp大的元素向右移 (为该元素留位置)
array[j] = array[j - 1]
// 空位置的下标-1
j--
}
// 将该元素放在 留出的空位中
array[j] = temp
}
return array
}
let array = [66, 88, 12, 87, 100, 5, 566, 23]
console.log(array) // [66, 88, 12, 87, 100, 5, 566, 23]
console.log(insertionSort(array)) // [5, 12, 23, 66, 87, 88, 100, 566]
谢谢观看。