冒泡排序
冒泡排序理解
冒泡排序是基础的排序算法之一,效率非常低,但作为一名前端开发,掌握它还是必不可少的技能。
冒泡排序是将相邻两个元素进行比较,根据条件进行调换位置达到排序的目的。
冒泡排序实现
本例最大的数字放在了最右边,则下次遍历可少比较一次最右边的,本次需比较的次数:数组最大索引值 - 1(因为要比较 j + 1, j + 1 需小于等于数组最大索引值)- 遍历的次数
在力扣上通过排序测试时间如下:
function maopao(nums) {
for (let i = 0; i < nums.length; i++) {
for (let j = 0; j < nums.length - 1 - i; j++) {
if (nums[j] > nums[j + 1]) {
const temp = nums[j]
nums[j] = nums[j + 1]
nums[j + 1]= temp
}
}
}
}
var e = JSON.parse(JSON.stringify(c))
maopao(e)
console.log(e);
冒泡排序优化
有可能在上面的遍历未结束之前,数组已经排序完成,所以当数组在一次内循环结束之后排序不变,则代表排序完成,可跳出遍历
在力扣上通过排序测试时间如下:
function maopao2(nums) {
for (let i = 0; i < nums.length; i++) {
let flag = false
for (let j = 0; j < nums.length - 1 - i; j++) {
if (nums[j] > nums[j + 1]) {
const temp = nums[j]
nums[j] = nums[j + 1]
nums[j + 1]= temp
flag = true
}
}
if (!flag) {
break
}
}
}
var f = JSON.parse(JSON.stringify(c))
maopao2(f)
console.log(f);
双向冒泡排序
双向遍历,一个是把最大的放在最后边,一个是把最小的放在最左边。双向冒泡排序在大部分情况下会比普通优化冒泡速度快些。
在力扣上通过排序测试时间如下:
双向冒泡代码实现
function maopao4(nums) {
let left = 0, right = nums.length - 1
for (let i = 0; i < nums.length; i++) {
if (left >= right) { // 左侧大于等于右侧,意味着左侧大于等于一半的length,说明已经完成整个排序了
break
}
let flag = false
if (i % 2 ===0) { // 通过奇偶来区分从左向右,还是从右向左
for (let j = left; j < right; j++) {
if (nums[j] > nums[j + 1]) {
const temp = nums[j]
nums[j] = nums[j + 1]
nums[j + 1]= temp
flag = true
}
}
right -- // 从左向右排序,最大的放在最右边,则最后边在下一轮不用参与排序,right --
} else {
for (let j = right; j > left; j--) {
if (nums[j - 1] > nums[j]) {
const temp = nums[j - 1]
nums[j - 1] = nums[j]
nums[j]= temp
flag = true
}
}
left ++ // 从右向左排序,最小的放在最左边,最左边最小在下一轮不用参与排序,left ++
}
if (!flag) { // 如果一轮里数据都没有变化,则说明排序完成,可终止排序
break
}
}
}
var h = [5,1,1,2,0,0]
maopao4(h)
console.log(h);