冒泡排序:通过n-1轮外层循环,每第 i 轮外层循环都会有一个n-1-i轮内层循环,且每一轮内层循环将无序序列的最大或最小的一个数,需要通过两两对比、交换的方式(可能存在多次位置交换)逐渐冒泡移动、增加到有序序列中。直到无序序列只剩最后一个最大或最小的数,默认进入有序序列,排序结束。
1 //冒泡排序 2 3 const NumberArr = [2, 2, 1, 6, 52, 4, 5, 8, 9, 17, 3]; 4 5 /** 6 * 升幂排序,进行n-1次排序,第n轮因为前面n-1个元素都排好序,只剩一个元素不需要比较排序 7 * 每一轮比较元素,不需要比较已经排序好的元素。所以减掉了很多重复排序 8 * @param {*} arr 未排序的数组 9 * @returns arr 已经排序好的数组 10 */ 11 function buddle_arr_asc(arr) { 12 for (let i = 0; i < arr.length - 1; i++) { 13 for (let j = 0; j < arr.length - (i + 1); j++) { 14 if (arr[j] > arr[j + 1]) { 15 let temp = arr[j]; 16 arr[j] = arr[j + 1]; 17 arr[j + 1] = temp; 18 } 19 } 20 } 21 return arr; 22 } 23 24 25 /** 26 * 降幂排序,进行n-1次排序,第n轮因为前面n-1个元素都排好序,只剩一个元素不需要比较排序 27 * 每一轮比较元素,不需要比较已经排序好的元素。所以减掉了很多重复排序 28 * @param {*} arr 未排序的数组 29 * @returns arr 已经排序好的数组 30 */ 31 function buddle_arr_desc(arr) { 32 for (let i = 0; i < arr.length - 1; i++) { 33 for (let j = 0; j < arr.length - (i + 1); j++) { 34 if (arr[j] < arr[j + 1]) { 35 let temp = arr[j]; 36 arr[j] = arr[j + 1]; 37 arr[j + 1] = temp; 38 } 39 } 40 } 41 return arr; 42 }
最坏情况——逆序:需要进行n(n-1)/2次比较,n-1次排序,n(n-1)/2次记录的移动,时间复杂度为O(n^2)。
最好情况——正序:需要进行n-1次比较,0次排序,0次移动,时间复杂度为O(n)。
稳定性:冒泡排序交换的是相邻的两个元素,如果两个元素相等,是不会交换两个元素的位置的,所以冒泡排序是稳定的。