一、冒泡排序(将大的值往后排)
第二层for循环是比较arr[ j ]和第arr[ j+1 ]的数值大小,所以会出现arr[ j ]<=arr[ j+1 ]的情况(即 [5, 9, 2, 6, 6, 10, 7, 45])。也就是说第一层for循环只能将数组中最大的数排到最后,其他较大的数的位置并不确定
第一层for循环使得第二层循环调用(arr.length - 1)次,这样其他较大的值就会继续往后排列。
let arr = [9, 5, 45, 2, 6, 6, 10, 7]
for (let i= 0; i < arr.length - 1; i++) {
for (let j = 0; j < arr.length - 1; j++) {
if (arr[j] > arr[j+1]) {
// 将大的值往后排
let tem = arr[j+1]
arr[j+1] = arr[j]
arr[j] = tem
}
}
}
console.log(arr)
二、选择排序(将大的值往前排)
找出最大的数放在第一位,然后在剩下的数组元素中接着找出最大的数放在第二位....
第二层for循环j的值从数组第二位开始,if判断确定两个数中较大的数的序号index=j,然后用arr[index]和第二层for'循环的下一位arr[j]比较。
let arr = [9, 5, 45, 2, 6, 6, 10, 7]
let index = 0 // 保存第二层循环每次比较时产生的最大数的数组序号
let tem = '' // 保存较小的数的值
for (let i = 0; i < arr.length - 1; i++) {
index = i
for (let j = i + 1; j < arr.length; j++) {
if (arr[index] < arr[j]) {
index = j
}
}
tem = arr[i]
arr[i] = arr[index]
arr[index] = tem
}
console.log(arr)
三、插入排序(将大的值往前排)
第一层for循环拿到后一个数值
第二层for循环将第一层for循环拿到的数值与前面的数值进行比较。
// 插入排序 后一个数和前面的数相比较,
let arr = [9, 5, 45, 2, 6, 6, 10, 7]
let tem = ''
for (let i = 1; i < arr.length; i++) {
for (let j = 0; j < i; j++) {
if (arr[i] > arr[j]) {
tem = arr[j]
arr[j] = arr[i]
arr[i] = tem
}
}
}
四、希尔排序(将大的值往前排)
// 希尔排序 后一个数和前面的数相比较,
let arr = [9, 5, 45, 2, 6, 6, 10, 7]
let half = parseInt(arr.length / 2)
let tem = ''
// 控制增量
for (let gap = half; gap >= 1; gap = parseInt(gap / 2)) {
console.log('-----gap:' + gap)
// 循环增量范围内的数组
for (let i = gap; i < arr.length; i++) {
// 循环增量控制下的小数组内的数字
for (let j = i - gap; j >= 0; j = j - gap) {
console.log(j, arr[j], arr[j + gap])
if (arr[j] < arr[j + gap]) {
tem = arr[j]
arr[j] = arr[j + gap]
arr[j + gap] = tem
}
}
}
}