一些简单的算法
Published:
本文介绍一些简单的算法在 js 中的实现。
冒泡排序
var arr = [8, 100, 50, 22, 15, 6, 1, 1000, 999, 0];
function bubbleSort(arr) {
for (var i = 0, len = arr.length; i < len; i++) {
for (var j = 0, jLen = len - i; j < jLen; j++) {
if (arr[j] > arr[j + 1]) {
var tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
console.warn(arr, 'process');
}
console.log(arr);
}
bubbleSort(arr);
可以看出冒泡排序的核心是双重嵌套循环,时间复杂度为 O(N2);
快速排序
var arr = [8, 100, 50, 22, 15, 6, 1, 1000, 999, 0];
function quickSort(arr, left, right) {
if (left > right) {
return
}
var i = left;
var j = right;
// 基准数
var temp = arr[left];
console.warn('基准数:' + temp);
while (i !== j) {
// 先从右往左找
while (arr[j] >= temp && i < j) {
j--;
}
// 再从左往右找
while (arr[i] <= temp && i < j) {
i++;
}
// 交换两个数的位置
if (i < j) {
var tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
// 基准数归位
arr[left] = arr[i];
arr[i] = temp;
console.warn(arr, 'process');
// 继续左边
quickSort(arr, left, i - 1);
// 继续右边
quickSort(arr, i + 1, right);
}
quickSort(arr, 0, arr.length - 1);
console.log(arr);
相对于冒泡排序,quickSort 之所以比较快,是因为 quickSort 每次交换是跳跃式的。每次排序的时候设置一个基准数,将小于基准数的数全部放到基准数的左边,将大于基准数的数全部放到基准数的右边,不会像冒泡排序一样只能在相邻的数之间进行交换,交换的距离就大了,因此总的比较和交换的次数就少了,速度也就快了。当然最坏的情况下,仍有可能是相邻的两个数进行交换。因此快速排序的最差时间复杂度和冒泡排序是一样的,都是 O(N2),它的平均时间复杂度是 O(NlogN)。