1、算法---栈
判断括号成对出现
sdfj(nrg(lj()k)nk)sldjwef 合法
q(wdwf()hknkql(whdq)w) 合法
hk)nqeif)liq(h(flq)wj( 不合法
思路:
括号存在嵌套关系,也存在并列关系
可以遍历字符串的每一个字符,使用栈来处理:
(1)遇到左括号,把左括号压入栈中
(2)遇到右括号,判断栈是否为空,为空说明没有左括号与之对应,则不合法。如果栈不为空,则移除栈顶的左括号---这对括号抵消了
当遍历结束后,如果栈是空的则合法,否则不合法
2、冒泡排序
解析:
(1)比较相邻的两个元素,如果前一个比后一个大,则交换位置
(2)第一轮的时候,最后一个元素应该是最大的一个
(3)按照步骤(1)的方法进行相邻两个元素比较,由于最后一个元素已经是最大的了,所以最后一个元素不用比较
// 冒泡排序 let arr = [1, 6, 3, 7, 5, 9, 2, 8]; function sort(arr) { // 升序 console.time("冒泡排序耗时") let num = null for (let i = 0; i < arr.length - 1; i++) { // 外层循环的作用是:每次循环找出一个最大数放在这个数组的最后面 for (let j = 0; j < arr.length - i - 1; j++) { // 内层循环的作用是:比较相邻两个数的大小从而进行交换位置 // 借助一个中间容器交换位置 if (arr[j] > arr[j + 1]) { num = arr[j] arr[j] = arr[j + 1] arr[j + 1] = num } } } console.log(arr) console.timeEnd("冒泡排序耗时") } sort(arr)
3、快速排序
解析:快速排序是对冒泡排序的一种改进,第一趟排序时将数据分成两个部分,一部分比另一部分的所有数据都要小。然后递归调用,在两边都实现快速排序。
// 快速排序 // 快速排序就是从中间取一个数,然后声明两个空数组 // 小于这个数的放在左边,大于这个数的放在右边 // 最后通过递归调用实现的一种排序方法 // 比冒泡排序用的更多 let arr = [1, 6, 3, 7, 2, 2, 2, 5, 9, 2, 8]; function sort(arr) { if (arr.length <= 1) { // 递归出口 return arr } let middleIndex = Math.floor(arr.length / 2) // 中间数的下标,分奇偶 let middle = arr.splice(middleIndex, 1)[0] let left = [] let right = [] for (let i = 0; i < arr.length; i++) { if (arr[i] < middle) { left.push(arr[i]) } else{ right.push(arr[i]) } } return sort(left).concat([middle], sort(right)) } console.log(sort(arr))