冒泡排序:是一种排序思想,主要目的就是对数组中的元素进行从大到小或者从小到大的排序
思想:用相邻的2个元素做比较,把大的元素往后放,经过多轮比较之后,一定可以排好序
var arr = [10, 4, 7, 9, 20, 8, -1, 100, 90, 50]
//===========第一轮比较
// 1
if (arr[0] > arr[1]) {
var temp = arr[0]
arr[0] = arr[1]
arr[1] = temp
}
console.log(arr);
// 2
if (arr[1] > arr[2]) {
var temp = arr[1]
arr[1] = arr[2]
arr[2] = temp
}
console.log(arr);
// 3
if (arr[2] > arr[3]) {
var temp = arr[2]
arr[2] = arr[3]
arr[3] = temp
}
console.log(arr);
// 4
if (arr[3] > arr[4]) {
var temp = arr[3]
arr[3] = arr[4]
arr[4] = temp
}
console.log(arr);
// 5
if (arr[4] > arr[5]) {
var temp = arr[4]
arr[4] = arr[5]
arr[5] = temp
}
console.log(arr);
/* =========================简化第一轮比较的代码
第一轮比较的次数刚好是数组的长度-1,所以就可以写小于等于length-2或者小于length-1
循环的起始值:应该写0,因为第一轮比较是要拿下标0和下标1比较
一定要记住数组中的下标是从0开始*/
for (var i = 0; i < arr.length-1; i++) {
console.log(i);
// 分析[]中数据规律
// 0 1
// 1 2
// 2 3
// 3 4
// 4 5
if (arr[i] > arr[i + 1]) {
var temp = arr[i]
arr[i] = arr[i + 1]
arr[i + 1] = temp
}
}
console.log(arr);
// ======================第二轮比较
// 1
if (arr[0] > arr[1]) {
var temp = arr[0]
arr[0] = arr[1]
arr[1] = temp
}
// 2
if (arr[1] > arr[2]) {
var temp = arr[1]
arr[1] = arr[2]
arr[2] = temp
}
// 3
if (arr[2] > arr[3]) {
var temp = arr[2]
arr[2] = arr[3]
arr[3] = temp
}
// 4
if (arr[3] > arr[4]) {
var temp = arr[3]
arr[3] = arr[4]
arr[4] = temp
}
console.log(arr);
// ======================简化第二轮比较的代码
for (var i = 0; i < arr.length - 2; i++) {
if (arr[i] > arr[i + 1]) {
var temp = arr[i]
arr[i] = arr[i + 1]
arr[i + 1] = temp
}
}
console.log(arr);
// ====================开始第三轮比较 第三轮 比较只需要拿前面4个数字作比较即可
// 也就是拿下标0和1 1和2 2和3比即可 只需要比3次即可
for (var i = 0; i < arr.length - 3; i++) {
if (arr[i] > arr[i + 1]) {
var temp = arr[i]
arr[i] = arr[i + 1]
arr[i + 1] = temp
}
}
console.log(arr);
//=====================开始第四轮比较 第四轮只需要拿前面剩余的3个数字作比较即可
//也就是拿下标0和1比 1和2比较 只需要比较2次即可
for (var i = 0; i < arr.length - 4; i++) {
if (arr[i] > arr[i + 1]) {
var temp = arr[i]
arr[i] = arr[i + 1]
arr[i + 1] = temp
}
}
console.log(arr);
//================开始第五轮比较 第五轮比较只需要拿剩余的前2个数字做比较即可
//也就是拿下标0和1比较 比1次就可以了
for (var i = 0; i < arr.length - 5; i++) {
if (arr[i] > arr[i + 1]) {
var temp = arr[i]
arr[i] = arr[i + 1]
arr[i + 1] = temp
}
}
console.log(arr);
简化版本
var arr = [10, 4, 7, 9, 20, 8, -1, 100, 90, 50]
// 外层循环思考:比较多少轮 数组的长度-1
// 内层循环中:小于的规律:arr.length-j-1
for (var j = 0; j < arr.length - 1; j++) {
for (var i = 0; i < arr.length - j - 1; i++) {
if (arr[i] > arr[i + 1]) {
var temp = arr[i]
arr[i] = arr[i + 1]
arr[i + 1] = temp
}
}
}
console.log(arr);
选择排序:把关注点放到索引上
比如要想进行从小到大的排序,那么最终索引0的位置应该存放的是数组中的最小值,依次类推
思想:
首先需要在数组中先找出最小数据的索引,定义一个变量minIndex用来准们存储最小数据的索引
经过一轮比较之后,一定可以找出最小数据的索引,已知最小数据应该要放在索引0的位置
这时候就把最小数和索引0位置的数据进行交换,这样第一轮结束后索引0的位置存储的一定是最小值
下一次再从剩余的数当中再次找最小值的索引,找到之后把这个数放到索引1的位置
依次类推
找最小数的索引的逻辑
第一轮:
1.先假设索引0就是最小数,先假设minIndex = 0
2.让minIndex的数据和数组中的数据挨个比较(遍历)
从几开始遍历:从1开始,
3.如果minIndex中的数据是大于数组中的数据的,就证明此时数组的这个下标应该是比较小的
我们应该让这个下标重新存储到minIndex上
第二轮的比较:第一个数就不用再参与比较,因为已经确定好了
所以直接拿后面的数字开始比较即可,要从后面的数字中再次找出最小数的索引
后面数的下标:1 2 3 4 5
1.先假设索引1就是最小数minIndex = 1
2.让minIndex的数据和数组中后面的数挨个作比较
从几开始遍历
第三轮.......
// 第一轮比较==========================
var arr = [9, 8, 10, 5, 6, 4]
var minIndex = 0
for (var i = 1; i < arr.length; i++) {
if (arr[minIndex] > arr[i]) {
minIndex = i
}
}
console.log(minIndex);
// 要把最小数放到下标0的位置,也就是让[minIndex]对应的数据和[0]对应的数据做个交换
var temp = arr[minIndex]
arr[minIndex] = arr[0]
arr[0] = temp
console.log('第一轮结束:', arr);
// 第二轮===================
var minIndex = 1
for (var i = 2; i < arr.length; i++) {
if (arr[minIndex] > arr[i]) {
minIndex = i
}
}
console.log(minIndex);
// 第二轮需要把minIndex的数据挪到下标1的位置,也就是让[minIndex]对应的数据和[1]对应的数据做个交换
var temp = arr[minIndex]
arr[minIndex] = arr[1]
arr[1] = temp
console.log('第二轮结束:', arr);
// 第三轮=========================
var minIndex = 2
for (var i = 3; i < arr.length; i++) {
if (arr[minIndex] > arr[i]) {
minIndex = i
}
}
console.log(minIndex);
// 第二轮需要把minIndex的数据挪到下标2的位置,也就是让[minIndex]对应的数据和[2]对应的数据做个交换
var temp = arr[minIndex]
arr[minIndex] = arr[2]
arr[2] = temp
console.log('第三轮结束:', arr);
// 第四轮=========================
var minIndex = 3
for (var i = 4; i < arr.length; i++) {
if (arr[minIndex] > arr[i]) {
minIndex = i
}
}
console.log(minIndex);
// 第四轮需要把minIndex的数据挪到下标3的位置,也就是让[minIndex]对应的数据和[3]对应的数据做个交换
var temp = arr[minIndex]
arr[minIndex] = arr[3]
arr[3] = temp
console.log('第四轮结束:', arr);
// 第五轮=========================
var minIndex = 4
for (var i = 5; i < arr.length; i++) {
if (arr[minIndex] > arr[i]) {
minIndex = i
}
}
console.log(minIndex);
// 第五轮需要把minIndex的数据挪到下标4的位置,也就是让[minIndex]对应的数据和[4]对应的数据做个交换
var temp = arr[minIndex]
arr[minIndex] = arr[4]
arr[4] = temp
console.log('第五轮结束:', arr);
简化版本
var arr = [9, 8, 10, 5, 6, 4]
for (var j = 0; j < arr.length - 1; j++) {//j = 0 1 2 3 4 j<6-1(5)
var minIndex = j //0 1 2 3 4
for (var i = j + 1; i < arr.length; i++) {//i = 1 2 3 4 5
if (arr[minIndex] > arr[i]) {
minIndex = i
}
}
var temp = arr[minIndex]
arr[minIndex] = arr[j]//0 1 2 3 4
arr[j] = temp
}
console.log('结束:', arr);