冒泡排序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,那么我们可以断定数组已经是有序的,因此可以提前结束排序。这个优化可以显著减少排序算法在不必要的情况下的运行时间,特别是在数组已经部分有序或完全有序的情况下。

值得注意的是,尽管冒泡排序对于小型数据集或几乎已排序的数据集可能表现良好,但它在大型数据集上的性能通常较差。对于大型数据集,更高效的排序算法(如快速排序、归并排序或堆排序)通常会是更好的选择。