import {swap} from "../util/index.mjs" export function bubbleSort(arr) { let n = arr.length for (let i = 1;i < n; i++) { // 理解为何i从1开始,因为冒泡排序是两两比较的,此循环只是限制比较的次数 for(let j = 0;j < n-i;j++) { // 此循环才是排序的关键,当当前值大于后一个值时交换位置,没做完一遍最后一个值永远是本轮循环最大的 if (arr[j] > arr[j+1]){ swap(arr, j, j+1) } } } } // 优化方案1 export function bubbleSort2(arr) { let n = arr.length; for (let i = 1;i arr[j+1]) { swap(arr, j, j+1) hasSort = false // 交换元素之后,设置标志位为无序状态 } } if (hasSort == true) { break } } } // 优化方案2 export function bubbleSort3(arr) { let n = arr.length, k = n-1, swapPos = 0; for (let i = 1;i arr[j+1]) { swap(arr, j, j+1) hasSort = false // 交换元素之后,设置标志位为无序状态 swapPos = j // 记录最后一次交换的元素的位置 } } if (hasSort == true) { break } k = swapPos // 把最后一次交换的位置给k,之后的排序支队1 - n-k的元素进行比较,因为之后的元素都是有序的 } } // 鸡尾酒排序(冒泡排序变形) export function cocktailSort(arr) { let left = 0, right = arr.length - 1, index; while(left < right) { // 大的排在后面 for (let i = left;i < right;i++) { if (arr[i] > arr[i+1]) { swap(arr, i, i+1) index = i } } // 第一轮排完之后index右侧的数字都是有序的,只需从index开始排就行(重点) right = index // 小的排前面 for (let i = right;i > left;i--) { if (arr[i] < arr[i-1]) { swap(arr, i, i-1) index = i } } left = index } }