冒泡排序js代码
冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
以下是一个JavaScript版本的冒泡排序代码:
javascript复制代码function bubbleSort(arr) { var len = arr.length; for (var i = 0; i < len - 1; i++) { for (var j = 0; j < len - 1 - i; j++) { if (arr[j] > arr[j + 1]) { // 相邻元素两两对比 var temp = arr[j + 1]; // 元素交换 arr[j + 1] = arr[j]; arr[j] = temp; } } } return arr; } // 测试代码 var arr = [34, 8, 64, 51, 32, 21]; console.log(bubbleSort(arr)); // 输出: [8, 21, 32, 34, 51, 64]
在这个代码中,bubbleSort
函数接受一个数组作为输入,然后通过嵌套的 for
循环来比较和交换数组中的元素。外层循环控制所有需要遍历的轮数,内层循环负责在每一轮中对比相邻的元素并交换它们(如果需要)。如果在一个完整的内层循环中没有发生任何交换,那么数组就已经是有序的,可以提前退出排序过程。然而,在这个基本的冒泡排序实现中,我们没有包括这个优化。
确实,基本的冒泡排序实现可能不是最优的,因为它在数组已经有序的情况下仍然会进行不必要的比较。为了提高效率,我们可以在内层循环结束后检查是否有过交换,如果没有,说明数组已经有序,可以提前结束排序。
下面是一个优化过的冒泡排序实现,它包含了这个提前结束排序的优化:
javascript复制代码function bubbleSort(arr) { var len = arr.length; for (var i = 0; i < len - 1; i++) { var swapped = false; // 标记本轮是否有交换 for (var j = 0; j < len - 1 - i; j++) { if (arr[j] > arr[j + 1]) { // 相邻元素两两对比 var temp = arr[j + 1]; // 元素交换 arr[j + 1] = arr[j]; arr[j] = temp; swapped = true; // 标记发生了交换 } } if (!swapped) { break; // 本轮没有交换,说明数组已经有序,提前结束 } } return arr; } // 测试代码 var arr = [34, 8, 64, 51, 32, 21]; console.log(bubbleSort(arr)); // 输出: [8, 21, 32, 34, 51, 64]
在这个优化后的版本中,我们增加了一个 swapped
变量来跟踪每一轮是否有元素被交换。如果在内层循环结束后 swapped
仍然是 false
,那么我们可以断定数组已经是有序的,因此可以提前结束排序。这个优化可以显著减少排序算法在不必要的情况下的运行时间,特别是在数组已经部分有序或完全有序的情况下。
值得注意的是,尽管冒泡排序对于小型数据集或几乎已排序的数据集可能表现良好,但它在大型数据集上的性能通常较差。对于大型数据集,更高效的排序算法(如快速排序、归并排序或堆排序)通常会是更好的选择。