冒泡排序(JS版)
冒泡排序的排序过程是简单直观的,主要的执行步骤:
1. 比较未排序序列中的相邻元素,如果两者的顺序不正确,则对两个元素进行交换;
2. 重复地对剩余未排序的元素执行上一步,直至完成排序;
具体代码实现细节:
1. 外层循环控制执行的轮数(如果有n个元素,一般会执行n-1轮);
2. 内层循环对未排序序列执行相邻元素的比较操作(后半部序列逐渐变得有序);
3. 可以做一些细节优化,提升一些执行性能。
执行过程的动态演示:
示例代码:
/** * 冒泡排序(小优化方式1) */ var bubbleSort = function (nums) { const n = nums.length; // 控制执行轮数 for (let i = 0; i < n - 1; i++) { // 当次的所有元素是否已经有序(未发生位置交换) let hasOrdered = true; // 比较相邻元素并交换 for (let j = 0; j < n - 1 - i; j++) { if (nums[j] > nums[j + 1]) { swap(nums, j, j + 1); hasOrdered = false; } } if (hasOrdered) break; } }; /** * 冒泡排序(小优化方式2) */ var bubbleSort = function(nums) { // 数据容量 const n = nums.length; // 当前轮次的排序过程中,发生过元素的交换 let hasSwapped = true; // 控制执行轮数 for (let i = 0; i < n - 1; i++) { // 如果上一轮未发生位置的交换,则直接退出(已完成排序) if (!hasSwapped) break; // 初始化当前轮交换状态的值 hasSwapped = false; // 比较相邻元素并交换 for (let j = 0; j < n - 1 - i; j++) { if (nums[j] > nums[j + 1]) { swap(nums, j, j + 1); hasSwapped = true; } } } }; /** * 交换两个位置上的元素 */ var swap = function(nums, i, j) { const num = nums[i]; nums[i] = nums[j]; nums[j] = num; };
(2021年9月左右的记录)冒泡排序的示例:
var bubbleSort = function(nums) { var n = nums.length; for (var i = 0; i < n - 1; i++) { for (var j = 0; j < n - 1 - i; j++) { if (nums[j] > nums[j + 1]) { swap(nums, j, j + 1); } } } }; // 1. 利用中间变量 var swap = function(nums, i, j) { var t = nums[i]; nums[i] = nums[j]; nums[j] = t; }; // 2. 利用加法(可能越界) var swap = function(nums, i, j) { nums[j] = nums[i] + nums[j]; nums[i] = nums[j] - nums[i]; nums[j] = nums[j] - nums[i]; };
End