1. 选择排序
思想:每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在待排序的数列的最前,直到全部待排序的数据元素排完。
时间复杂度:O(n2)
2. 冒泡排序
思想:它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
操作过程:
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
时间复杂度:最坏:O(n2)
最好:O(n)
3. 桶排序
思想:若待排序的数据在一个明显有限范围内(整型)时,可设计有限个有序桶,每个桶中装入一个值(当然也可以入若干个值),顺序输出各桶的值,得到有序序列。
空间换时间:需开辟数据取值范围大小的空间
时间复杂度:O(max(数据范围, n))
4. 快速排序
思想:通过一趟快速排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
时间复杂度:最好:O(n*logn)
最坏:O(n2) 相当于选择排序
快速排序的标准模板函数:sort
注意:包含头文件#include <algorithm>
添加using namespace std;
使用:(1)sort(数组起始地址,数组结束地址)
(2)需自定义比较函数
int compare(stdInfo &a, stdInfo &b) { return a.score < b.score } sort(a, a+length, compare)
5. 归并排序
归并操作的概念:将两个或两个以上有序的数组,合并成一个仍然有序的数组。
二路归并过程:从两个有序数组的表头开始依次比较a[i]和a[j]的大小,如果a[i] < a[j],则将a[i]复制到归并数组r[k]中,并且i和k都加1后移,否则将a[j]复制归并到r[k]中,并且j和k都加1后移;如此循环下去,直到其中一个有序表取完后再将另外一个有序表中剩余的元素复制到r中。
二路归并排序实现思路:递归实现
先把待排序区间[s,t]以中点二分,接着把左边子区间排序,右边子区间排序,最后把左边子区间和右边子区间用一次归并操作(执行过程如前述的二路归并过程)合成有序的区间[s,t]。
左边子区间和右边子区间的排序过程和原问题一样,调用相同的子程序,只是排序区间不一样。
依次类推,当分出来的小组只有一个数据时,可以认为这个小组组内已经达到了有序,然后再合并相邻的二个小组就可以了。
通过先递归的分解数列,再合并数列就完成了归并排序。
时间复杂度:O(n*logn)
---恢复内容结束---