functionselectionSort(arr){ for(let i = 0; i < arr.length - 1; i++){ let min = i for(let j = i + 1; j < arr.length; j++){ min = arr[j] < arr[min] : j : min } swap(arr, i, min); } functionswap(arr, i, min){ let temp; arr[i] = temp; arr[i] = arr[min]; arr[min] = temp; } }
冒泡排序的时间复杂度为 O(n2) 额外空间复杂度 O(1) 是稳定的排序算法
冒泡排序(bubble sort)
比较两个相邻的元素A、B(假设 A 在 B 前面), 如果A > B(A < B)则交换 A 与 B 的顺序。 每一轮结束后,最后一个元素为最大(最小)的值。每一轮可以选出一个最大(最小值)。选出后在再其他元素中继续选。直到只剩一个元素排列完毕。 代码如下:
for(let i = 0; i < arr.length; i++){ const a = oddCode(i, arr); const b = evenCode(i, arr); const res = [] res.push(Math.max(a, b)); }
// 任意取一个字符, 判断以它为中心的奇数回文的长度 functionoddCode(index, arr){ let left = index - 1; let right = index + 1; let count = 1; while(left >= 0 && right < arr.length){ if(arr[left] === arr[right]){ count += 2; left--; right++; }else{ return count; } } return count; }
// 任意取一个字符, 判断它是不是偶数回文串的长度 functionevenCode(index, arr){ let left = index; let right = index + 1; let count = 0; while(left >= 0 && right < arr.length){ if(arr[left] === arr[right]){ count += 2; left --; right ++; }else{ return count; } } return count; }
// 建立辅助数组 const ast = newArray(m + 2); for (let i = 0; i < m + 2; i++) { if (i === 0) ast[i] = newArray(n + 2).fill(1); if (i > 0 && i < m + 1) { ast[i] = readline().split(" ").map(Number); ast[i].push(1); ast[i].unshift(1); } if (i === m + 1) ast[i] = newArray(n + 2).fill(1); }
functionfindPath(ast, i, j) { // 到达终点,直接返回 if (i === m && j === n) return [[i - 1, j -1]];
// 对于走过的点 置为 1 ast[i][j] = 1; if (ast[i - 1][j] === 0) { const up = findPath(ast, i - 1, j); if(up.length) return [[i - 1, j - 1],...up] } if (ast[i + 1][j] === 0) { const down = findPath(ast, i + 1, j); if(down.length) return [[i - 1, j - 1],...down] } if (ast[i][j - 1] === 0) { const left = findPath(ast, i, j - 1); if(left.length) return [[i - 1, j - 1],...left] } if (ast[i][j + 1] === 0) { const right = findPath(ast, i, j + 1); if(right.length) return [[i - 1, j - 1],...right] } return []; }