第二章:排序
众所周知,纷繁复杂的排序算法是无数面试官折磨毕业生的神奇;现在就让我们来看看各种各样的排序算法吧;
1.选择排序
冒泡排序的逻辑是:
- 从需要排序的序列中选出最小值放置到左边
- 下一个循环将不考虑最左侧的元素
- 序列只有一个元素时停止排序
冒泡排序的复杂度是 O ( n 2 ) O(n^2) O(n2)
2.冒泡排序
冒泡排序的逻辑是:
- 虚拟扫描头同时检查两个两个相邻变量,左大于右则不变,否则交换位置
- 扫描头向右移动一格,检查并交换变量
- 此过程循环进行,直到某次循环没有进行任何操作时,循环终止
冒泡排序的复杂度也是 O ( n 2 ) O(n^2) O(n2)
3.插入排序
插入排序的逻辑是:
- 从右侧取一个元素,插入到左侧已经排序过的序列中合适的位置
- 左侧排序过的序列长度加一,右侧未排序过的序列长度减一
- 循环执行直到全部元素都已排序
第一次开始排序时,需要从序列中选出一个最小的放置在最左边;
插入排序的时间复杂度是 O ( n 2 ) O(n^2) O(n2)
4.堆排序
前面的文章中提到过堆,而使用堆排序也是一种可行的办法;具体的做法是:先构建一个堆,再一个一个取出元素,然后排序就完成了;
堆的构建方式,元素的取出操作都在前面的文章中提到了;
堆排序的时间复杂度为 O ( n lg n ) O(n\lg{n}) O(nlgn)
5.归并排序
归并排序的精髓是:把一个序列分割为两个序列,把剩下的序列一分为二,直到不能再分割为止;然后开始把相邻的两个序列合并,每次合并时都进行排序,当从所有序列全部都合成为一个序列时,排序就完成了;
归并排序的复杂度为 O ( n lg n ) O(n\lg{n}) O(nlgn),和堆排序相同;
6.快速排序
说实话这个排序算法的名字起的相当嚣张;
这个算法首先在序列中随机选择一个数作为基准值,然后将小于这个数的值放在左边,将大于这个数的值放在右边;接着对基准值两边的序列执行相同的操作,直到序列被完全排序为止;
快速排序的平均运行时间为 O ( n lg n ) O(n\lg{n}) O(nlgn),显然对不起这个名字,它和归并排序和堆排序的时间复杂度是一样的;