//i是外层的游标,j是内层的元素
function swap(i, j, array) {
var temp = array[i]; //临时存储位置的值
array[i] = array[j]; //把j位置的值交给位置
array[j] = temp; //临时存储的值交给j位置
}
/*
function swap(i, j, array) {
var temp = array[j];
array[j] = array[i];
array[i] = temp;
}
*/
function bubbleSort(array) {
var length = array.length, isSwap;
for (var i = 0; i < length; i++) {
isSwap = false;
for (var j = 0; j < length - 1 - i; j++) {
array[j] > array[j + 1] && (isSwap = true) && swap(j, j + 1, array);
}
if (!isSwap)
break;
}
return array;
}
内层是递增的,所以是确定靠后的元素。排序结果是:
接下来是这种方式的几种变种方式
内层是逆序,所以前面的元素先确定
function bubbleSort(array) {
var length = array.length, isSwap;
for (var i = 0; i < length; i++) {
isSwap = false;
for (var j = length - 1; j >= i + 1; j--) {
array[j] < array[j - 1] && (isSwap = true) && swap(j, j - 1, array);
}
if (!isSwap)
break;
}
return array;
}
function bubbleSort(array) {
var length = array.length, isSwap;
for (var i = length - 1; i >= 0; i--) {
isSwap = false;
for (var j = 0; j < length - i - 1; j++) {
array[j] > array[j + 1] && (isSwap = true) && swap(j, j + 1, array);
}
if (!isSwap)
break;
}
return array;
}
function bubbleSort(array) {
var length = array.length, isSwap;
for (var i = length - 1; i >= 0; i--) {
isSwap = false;
for (var j = length - 1; j >= length - i - 1; j--) {
array[j] < array[j - 1] && (isSwap = true) && swap(j, j - 1, array);
}
if (!isSwap)
break;
}
return array;
}
双向冒泡排序,性能比冒泡排序要好点。
function bothWayBubbleSort(array) {
var tail = array.length - 1, i, isSwap = false;
for (var i = 0; i < tail; tail--) {
for (var j = tail; j > i; j--) {
array[j - 1] > array[j] && (isSwap = true) && swap(j, j - 1, array)
}
i++;
for (var j = i; j < tail; j++) {
array[j] > array[j + 1] && (isSwap = true) && swap(j, j + 1, array)
}
}
return array;
}