区别
1.冒泡排序是比较相邻位置的两个数,而选择排序是按顺序比较,找最大值或者最小值;
2.冒泡排序每一轮比较后,位置不对都需要换位置,选择排序每一轮比较都只需要换一次位置;
3.冒泡排序是通过数去找位置,选择排序是给定位置去找数;
冒泡排序的优缺点
1.优点:比较简单,空间复杂度较低,是稳定的;
2.缺点:时间复杂度太高,效率慢;
选择排序优缺点
1.优点:一轮比较只需要换一次位置;
2.缺点:效率慢,不稳定(举个例子5,8,5,2,9 我们知道第一遍选择第一个元素5会和2交换,那么原序列中2个5的相对位置前后顺序就破坏了)。
冒泡排序实现
//冒泡排序
function bubble(arr) {
// 判断传入的数组是否为空或者数组长度小于2
if (arr == null || arr.length < 2) {
return arr;
}
for (var i = 0; i < arr.length - 1; i++) {
for (var j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
swap(arr, j, j + 1);
}
}
}
return arr;
}
//异或运算 进行两数交换
function swap(arr, i, j) {
arr[i] ^= arr[j];
arr[j] ^= arr[i];
arr[i] ^= arr[j];
}
console.log(bubble([1, 5, 2, 4, 8, 9, 10]));
注:异或运算
选择排序实现
//选择排序
function selectionSort(arr) {
// 判断传入的数组是否为空或者数组长度小于2
if (arr == null || arr.length < 2) {
return arr;
}
//循环遍历
for (var i = 0; i < arr.length - 1; i++) {
//声明最小值下标
var minIndex = i;
for (var j = i + 1; j < arr.length; j++) {
minIndex = arr[j] < arr[minIndex] ? j : minIndex;
}
swap(arr, i, minIndex);
}
return arr;
}
// 两个数交换
function swap(arr, i, j) {
var temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
console.log(selectionSort([1, 5, 7, 2, 4, 6, 9]));