概述
冒泡排序是很多初学编程的程序员接触到的第一种排序算法,它也是所有排序算法中最简单的算法,但是它是众多排序算法中,排序效率最差的一个。
冒泡排序比较所有相邻的两个项,如果第一个比第二个大,则交换它们。元素项向上移动至正确的顺序,就好像气泡升至表面一样,冒泡排序因此得名。
冒泡排序全解析
假如有这样一组数值不等的数组,将天平放在数组序列的右端,并比较天平左右的数字。
在这种情况下,我们将比较7和6。
比较后,如果两个树中,右边的数字较小,则交换这两个数字的位置。
因为6比7小,所以这两个数字要进行交换。
比较完成后,天平往前左移一个位置。
再重复比较数字的操作
因为6大于4,所以不需要进行交换。
比较完成后,天平再接着往前左移一个位置。
不断重复比较两个数字和天平往前左移一个位置的操作……
直到天平移动到左端。
此时最左端的数字已经排序好了
再将天平返回右端,重复之前相同的操作,对其他数组进行排序(忽略已经排序好的数字)
每重复一轮相同的操作,左侧会有一个数字被排序好,直到所有数字都被排序。
此时,这一组数值不等的数组,已经被排序完成。
代码实现冒泡排序
为方便排序时的相邻数字比较或交换,定义一些比较和交换用的常量和方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| export const Compare = { LESS_THAN: -1, BIGGER_THAN: 1, EQUALS: 0 };
export function defaultCompare(a, b) { if (a === b) { return Compare.EQUALS; } return a < b ? Compare.LESS_THAN : Compare.BIGGER_THAN; }
export function swap(array, a, b) {
[array[a], array[b]] = [array[b], array[a]]; }
|
实现冒泡排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
export function bubbleSort(array, compareFn = defaultCompare) { const { length } = array; for (let i = 0; i < length; i++) { for (let j = 0; j < length - 1; j++) { if (compareFn(array[j], array[j + 1]) === Compare.BIGGER_THAN) { swap(array, j, j + 1); } } } return array; }
|
上述的冒泡排序算法,并没有忽略已经排序好的数字,导致对已经排序好的数字进行了较多无用的对比判断。
所以可以对算法进行改进,对比时忽略已经排序好的数字:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
export function modifiedBubbleSort(array, compareFn = defaultCompare) { const { length } = array; for (let i = 0; i < length; i++) { for (let j = 0; j < length - 1 - i; j++) { if (compareFn(array[j], array[j + 1]) === Compare.BIGGER_THAN) { swap(array, j, j + 1); } } } return array; }
|