JavaScript 排序算法
原生 sort 方法实现方式
各个浏览器的实现方式会有不同, 火狐中使用的是归并排序,Chrome 是插入排序和快速排序结合的排序算法。数组长度不超过 10 时,使用插入排序。长度超过 10 使用快速排序。在数组较短时插入排序更有效率 参看文章
1. 冒泡排序
算法描述
-
- 比较相邻的元素。如果第一个比第二个大,就交换它们两个
-
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数
-
- 针对所有的元素重复以上的步骤,除了最后一个
-
- 重复步骤 1~3,直到排序完成
算法实现
function bubbleSort(arr) {
var len = arr.length;
for (var i = 0; i < len; 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;
}
2. 快速排序
算法描述
-
- 从数组中挑出一个元素,称为 “基准”(pivot)
-
- 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作
-
- 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序
算法实现
var quickSort = function (arr) {
if (arr.length <= 1) {
return arr;
}
var pivotIndex = Math.floor(arr.length / 2);
var pivot = arr.splice(pivotIndex, 1)[0];
var left = [];
var right = [];
for (var i = 0; i < arr.length; i++) {
if (arr[i] < pivot) {
left.push(arr[i]);
} else {
right.push(arr[i]);
}
}
return quickSort(left).concat([pivot], quickSort(right));
};
var devide_Xin = function (array, start, end) {
if (start >= end) return array;
var baseIndex = Math.floor((start + end) / 2), // 基数索引
i = start,
j = end;
while (i <= j) {
while (array[i] < array[baseIndex]) {
i++;
}
while (array[j] > array[baseIndex]) {
j--;
}
if (i <= j) {
var temp = array[i];
array[i] = array[j];
array[j] = temp;
i++;
j--;
}
}
return i;
};
var quickSort_Xin = function (array, start, end) {
if (array.length < 1) {
return array;
}
var index = devide_Xin(array, start, end);
if (start < index - 1) {
quickSort_Xin(array, start, index - 1);
}
if (end > index) {
quickSort_Xin(array, index, end);
}
return array;
};
const quickSort_New = function (arr, left, right) {
if (left >= right) {
return arr;
}
let i = left;
let j = right;
base = arr[left];
while (i < j) {
// 从右边起,寻找比基数小的数
while (i < j && arr[j] >= base) {
j--;
}
// 从左边起,寻找比基数大的数
while (i < j && arr[i] <= base) {
i++;
}
if (i < j) {
var temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
arr[left] = arr[i];
arr[i] = base;
quickSort_New(arr, left, i - 1);
quickSort_New(arr, i + 1, right);
return arr;
};
3. 选择排序
算法描述
- 第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置
- 然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾
- 以此类推,直到全部待排序的数据元素的个数为零
算法实现
function selectionSort(arr) {
var len = arr.length;
var minIndex, temp;
for (var i = 0; i < len - 1; i++) {
minIndex = i;
for (var j = i + 1; j < len; j++) {
if (arr[j] < arr[minIndex]) { //寻找最小的数
minIndex = j; //将最小数的索引保存
}
}
temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
return arr;
}