冒泡排序
示例:10,2,3,-3,9
第一轮 每轮比较相邻两个数 总共比较 4 次
3 10 4 -3 9
3 4 10 -3 9
3 4 -3 10 9
3 4 -3 9 10
第二轮 总共 3 次 第二个较大值确定
3 4 -3 9 10
3 -3 4 9 10
3 -3 4 9 10
…
第四轮
总结 n 个数比较 n-1 轮次 每轮进行若干次相邻两数比较
示例:
var arr = [10, 2, 3, 12, 100, 0, -3, 11];
function bubbleSort(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]) {
// 交换位置
var temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
bubbleSort(arr);
console.log(arr);
选择排序
第一轮 第一个位置上的数与后面依次比较,找到最小的
10 3 -3 11 0
3 10 -3 11 0
-3 10 3 11 0
-3 10 3 11 0
第二轮 第二个位置的数与后面依次比较
-3 10 3 11 0
-3 3 10 11 0
-3 3 10 11 0
-3 0 10 11 3
…
示例:
var arr = [10, 4, 2, 4, 7, 33];
function selectSort(arr) {
var temp;
//选择排序
for (var i = 0; i <= arr.length - 1; i++) {
for (var j = i + 1; j <= arr.length - 1; j++) {
if (arr[i] > arr[j]) {
temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
}
return arr;
}
console.log(selectSort(arr));
插入排序
//插入排序
function insertionSort(data) {
var len = data.length;
for (var i = 1; i < len; i++) {
var key = data[i];
var j = i - 1;
while (j >= 0 && data[j] > key) {
data[j + 1] = data[j];
j--;
}
data[j + 1] = key;
}
return data;
}
快速排序
function quickSort(arr) {
var left = [],
right = [];
if (arr.length < 1) {
return arr;
}
var index = Math.floor(arr.length / 2); // 向下取整
var point = arr.splice(index, 1); // 从下标index开始删除1个元素
for (var i = 0; i < arr.length; i++) {
if (arr[i] < point) {
left.push(arr[i]);
} else {
right.push(arr[i]);
}
}
return quickSort(left).concat(point, quickSort(right));
}
sort 方法排序
提供比较函数,该函数比较两个值的大小,然后返回一个用于说明这两个值得相对顺序。
比较函数应该具有两个参数 a 和 b,其返回值如下:
若 a<b ,即 a-b 小于零,则返回一个小于零的值,数组将按照升序排列。
若 a=b ,则返回 0。
若 a>b,即 a-b 大于零,则返回一个大于零的值,数组讲按照降序排列。
var array = [1, 80, 4, 33, 21, 55];
array.sort(function (x, y) {
return x - y; //x-y为升序,y-x为降序
});
/*解释:x,y表示数组中的任意两个元素,若return > 0,则y前x;
若reutrn < 0 ,则x前y后;
当x=y时存在浏览器兼容。
简单来说:就是,x-y是按照从小到大排序,y-x是按照从大到小排序。*/
扩展 —— localeCompare()
方法
返回值
说明比较结果的数字。如果 stringObject
小于 target,则 localeCompare()
返回小于 0 的数。如果 stringObject
大于 target,则该方法返回大于 0 的数。如果两个字符串相等,或根据本地排序规则没有区别,该方法返回 0。
说明
把 < 和 > 运算符应用到字符串时,它们只用字符的 Unicode 编码比较字符串,而不考虑当地的排序规则。以这种方法生成的顺序不一定是正确的。例如,在西班牙语中,其中字符 “ch”
通常作为出现在字母 “c” 和 “d” 之间的字符来排序。
localeCompare()
方法提供的比较字符串的方法,考虑了默认的本地排序规则。ECMAscript
标准并没有规定如何进行本地特定的比较操作,它只规定该函数采用底层操作系统提供的排序规则。
var str;
str.sort(function (a, b) {
return a.localeCompare(b);
});