排序算法有哪些?
假设有一个没有任何排列顺序的电话号码簿(或笔记本)。当需要添加联络人和电话时,你只能将其写在下一个空位上。假定你的联系人列表上有很多人。某天,你要找某个联系人及其电话号码。但是由于联系人列表没有按照任何顺序来组织,你只能逐个检查,直到找到那个你想要的联系人为止。那得花多长时间啊?
需要组织信息集,比如那些存储在数据结构里的信息。最常用的排序和搜索算法,如冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序等算法。
冒泡排序:
冒泡算法在所有排序算法中最简单。从运行时间的角度来看,冒泡排序是最差的。冒泡排序比较所有相邻的两个项,如果第一个比第二个大,则交换它们。元素项向上移动至正确的顺序,就好像气泡升至表面一样,冒泡排序因此得名。
function bubbleSort(array, compareFn = defaultCompare) {
const { length } = array; // {1}
for (let i = 0; i < length; i++) { // {2}
for (let j = 0; j < length - 1; j++) { // {3}
if (compareFn(array[j], array[j + 1]) === Compare.BIGGER_THAN) { // {4}
swap(array, j, j + 1); // {5}
}
}
}
return array;
}
首先,声明一个名为length 的变量,用来存储数组的长度(行{1})。这一步可选,它能帮助我们在行{2}和行{3}时直接使用数组的长度。接着,外循环(行{2})会从数组的第一位迭代至最后一位,它控制了在数组中经过多少轮排序(应该是数组中每项都经过一轮,轮数和数组长度一致)。然后,内循环将从第一位迭代至倒数第二位,内循环实际上进行当前项和下一项的比较(行{4})。如果这两项顺序不对(当前项比下一项大),则交换它们(行{5}),意思是位置为j+1 的值将会被换置到位置j 处,反之亦然。
当算法执行外循环的第二轮的时候,数字4 和5 已经是正确排序的了。尽管如此,在后续比较中,它们还在一直进行着比较,即使这是不必要的。可以稍稍改进一下冒泡排序算法。
function modifiedBubbleSort(array, compareFn = defaultCompare) {
const { length } = array;
for (let i = 0; i < length; i++) {
for (let j = 0; j < length - 1 - i; j++) { // {1}
if (compareFn(array[j], array[j + 1]) === Compare.BIGGER_THAN) {
swap(array, j, j + 1);
}
}
}
return array;
}
如果从内循环减去外循环中已跑过的轮数,就可以避免内循环中所有不必要的比较(行{1})。
在正确位置上的数字没有被比较。做了小改变来改进冒泡排序算法。
但还是不推荐该冒泡排序算法,它的复杂度是O(n2)。
来源:https://www.cnblogs.com/hlaotong/p/12497273.html