冒泡排序
思路
将相邻的两个元素进行比较,然后将较小的元素放在左边,将较大的元素放在右边。一直重复,直到排序完毕。
实现(JAVA)
优缺点
每一趟排序后都会将最大的元素排在最右边,所以之后每趟排序都会减少一个待排元素
对n个元素进行排序,第 i 趟需要比较n-i次,共需要n-1趟排序
稳定性:稳定(如果a原本在b前面,且a = b,排序后a仍然在b前面)
时间复杂度最好情况为O(n),即全是正序的情况下。 最坏情况为O(n2),即全是倒序的情况下
空间复杂度为O(1)
优化
先判断数组内的元素是否有序,如果数组内的元素本身有序,则不进行排序。
选择排序
思路
每次遍历所有待排元素,选择其中最大/最小的元素,将其放在排序序列的起始位置。然后,再次遍历所有待排的剩余元素,选择其中最大/最小的元素,将其放在已排序列的末尾。重复此操作,直到排序完成。
实现(JAVA)
优缺点
一轮比较只需要交换一次位置。n个元素进行排序共需要交换n-1次
稳定性:不稳定(如果原本a在b的前面,且a = b,排序后a可能出现在b的后面)
时间复杂度为O(n2)
空间复杂度为O(1)
插入排序
思路
从第一个元素开始,默认第一个元素已经有序。
取出下一个元素,与前面已经排序的元素从后向前进行比较,如果此元素小于被比较的元素(已排序),则将被比较的元素向后移动一个位置。
直到找到此元素大于被比较的元素(已排序)的位置,将其插入到该位置。
重复此操作,直到排序完成。
实现(JAVA)
优缺点
相比于冒泡排序和选择排序更快
稳定性:稳定
时间复杂度最好情况为O(n),最坏情况为O(n2)。
空间复杂度为O(1)