冒泡排序
算法描述(从小到大排序)
比较相邻的元素,如果前一个比后一个大,交换之。
第一趟:第1个和第2个元素比较,随后第2个和第3个比较,这样直到倒数第2个和最后1个,将最大的数移动到最后一位。
第二趟:重复上面步骤,将第二大的数移动至倒数第二位
…
因此需要n-1趟;
// 冒泡排序
function BubbleSort(arr) {
// 判断是否数组
if (Array.isArray(arr)) {
console.log('yes');
// 遍历
let len = arr.length;
for (let i = 0; i < len; i++) {
for (let j = 0; j < len; j++) {
let max = arr[j];
if (arr[j] > arr[j + 1]) {
max = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = max;
}
}
}
return arr;
} else {
console.log('no');
}
}
// 冒泡排序优化
function BubbleSortOptimization(arr) {
// 判断是否数组
if (Array.isArray(arr)) {
console.log('yes');
// 遍历
let len = arr.length ;
for (let i = 0; i < len; i++) {
//因为每一次遍历,最大的值会排在最后,所以外层遍历每循环一次,len长度可减1
for (let j = 0; j < len - i; j++) {
let max = arr[j];
if (arr[j] > arr[j + 1]) {
max = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = max;
}
}
}
return arr;
} else {
console.log('no');
}
}
console.log('satrtTime', new Date().valueOf());
console.log('BubbleSort', BubbleSort([5, 4, 9, 7, 1, 2, 6, ]));
console.log('endTime', new Date().valueOf());
console.log('BubbleSortOptimization', BubbleSortOptimization([5, 4, 9, 7, 1, 2, 6]));
console.log('endTime', new Date().valueOf());
最终版本
/*
BuubleSort:冒泡排序;前后两个数比较大小,设置小的排前面
example:[2,7,1,89,35,4,9,11]
平均时间复杂度:O(n^2);
最好的时间复杂度: O(n);--一次遍历即可
最坏的时间复杂度:O(n^2);
*/
function BubbleSort(arr) {
// iS Array
if (!(arr instanceof Array)) return;
let length = arr.length - 1;
// 当数组存在元素并且多于一个元素时执行
if (length) {
let temp;
for (let i = 0; i < length; i++) {
// 每次排序,最大的会在后面,便不需要再继续排序,即jarr.length - 1
for (let j = 0; j < length - i; j++) {
// 当后面的数值小于前面的数值时,交换位置
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
console.log(arr);
return arr;
}
BubbleSort([2, 7, 1, 89, 35, 4, 9, 11]);