冒泡排序
冒泡排序是最简单的一种排序算法,同时也会效率最低的,因此在开发中很少使用这种算法进行排序
冒泡排序通过比较任何两个相邻的项,如果第一个比第二个大,则交换它们,元素项向上移动至
正确的顺序,就好像气泡升至表面一样,因此叫冒泡排序。
假设有一组数据[5,4,3,2,1]
,使用冒泡排序的比较过程如下
实现冒泡排序
function bubbleSort(array) {
var length = array.length;
for (var i = 0; i < length; i++) {
for (var j = 0; j < length - 1 - i; j++) {
if (array[j] > array[j + 1]) {
// ES6语法:位置交换
[array[j], array[j + 1]] = [array[j + 1], array[j]];
}
}
}
return array;
};
快速排序
JS数组有一个sort方法用于排序,chrome浏览器的v8引擎在实现sort时使用的就是快排,由于其出色的排序效率,快排是一种使用很频繁的排序算法。
快排的基本实现分为三步:
1. 在数据集之中,选择一个元素作为"基准"(pivot)。
2. 所有小于"基准"的元素,都移到"基准"的左边;所有大于"基准"的元素,都移到"基准"的右边。
3. 对"基准"左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。
假设现在有一组数据[85, 24, 63, 45, 17, 31, 96, 50]
,使用快速排序,运行过程如下所示
- 选择中间的元素45作为"基准"(基准值可以任意选择,但是选择中间的值比较容易理解)
- 按照顺序,将每个元素与"基准"进行比较,形成两个子集,"小于45"在左边,"大于等于45"在右边
- 对两个子集不断重复第一步和第二步,直到所有子集只剩下一个元素为止
结果
使用JS实现快速排序算法
var quickSort = function(arr) {
// 检查数组的元素个数,如果小于等于1,说明排序已完成,返回数组
if (arr.length <= 1) { return arr; }
// 选择"基准"(pivot),并将其与原数组分离,再定义两个空数组,用来存放一左一右的两个子集
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));
};
顺序搜索
顺序或线性搜索是最基本的搜索算法,它的机制是将每一个数据结构中的元素和我们要找的元素做比较,直到找到匹配的元素。
顺序搜索是最低效的一种搜索算法,下面是顺序搜索的实现
function sequentialSearch(item, array){
for (var i=0; i<array.length; i++){
if (item === array[i])
return i;
}
}
return -1;
};
二分搜索
二分搜索算法的原理和猜数字游戏类似,就是有人说“我正想着一个1到100的数字”的游戏。我们每回应一个数字,那个人就会说这个数字是高了、低了还是对了。这个算法要求被搜索的数据结构已排序,以下是该算法遵循的步骤
- 选择数组的中间值。
- 如果选中值是待搜索值,那么算法执行完毕(值找到了)。
- 如果待搜索值比选中值要小,则返回步骤1并在选中值左边的子数组中寻找。
- 如果待搜索值比选中值要大,则返回步骤1并在选中值右边的子数组中寻找。
function binarySearch(item, array) {
// quickSort(array); 先排序
var low = 0,
high = array.length - 1,
mid, element;
while (low <= high) {
mid = Math.floor((low + high) / 2);
element = array[mid];
if (element < item) {
low = mid + 1;
} else if (element > item) {
high = mid - 1;
} else {
return mid;
}
}
return -1;
};