根据时间复杂度的不同,可以将排序算法分为三大类:
1,时间复杂度为O(n*n):
冒泡排序
选择排序
插入排序
希尔排序
2,时间复杂度为O(nlogn)的排序算法
快速排序
归并排序
堆排序
3,时间复杂度为线性的排序算法
计数排序
桶排序
基数排序
除此之外其他的排序都是基于传统排序演变的。
其次还可以根据稳定性,分为稳定排序和不稳定排序。
稳定排序:如果值相同的元素在排序后仍然保持着排序前的顺序,则这样的排序算法是稳定排序。
不稳定排序:如果值相同的元素在排序后打乱了排序前的顺序,则这样的排序算法是不稳定排序。
一,冒泡排序
何为冒泡排序:就是把相邻的元素两两相比较,当一个元素大于右边的相邻元素时,交换位置,若反之小于则位置不变,相邻的这个元素继续和右边的相邻元素进行比较,这样依次向右比较,第一轮比较完之后最后一个元素一定是最大的元素。然后又从头开始第二轮比较。依次类推,反复重复,重复数组长度-1之后,数组元素一定是从左到右都是从大到小的排列。
冒泡排序是一种稳定排序,值相等的元素不会打乱原本的顺序,该算法每一轮都要遍历所有元素,总共遍历(元素长度-1)次,时间复杂度为O(n*n);
代买示例:
二,冒泡排序的优化
当元素排列到最后,顺序已经是有序的按照从小到大的顺序时,已经可以不用继续遍历了。此时,我们可以给它加一个标识位,当没有元素进行赋值时,跳出循环。
代码如下:
第二种优化:
当元素为43256789时,可以看出后面五位的顺序已经是从小到大的排列。在遍历时可以无需进行遍历,这样可以对提高排序的性能。
此时,我们应该记录下最后一次赋值的位置。遍历的最大长度为该位置的值就行。
代码如下:
三,鸡尾酒排序
冒泡排序的每一轮排序都是从左到右来比较元素,位置进行互换是单向的。而鸡尾酒排序则是双向的。即为先左到右,再右向左,依次类推,就像指针的左右摆动。
所以遍历的过程就变成了两种:奇数轮和偶数轮。则将遍历分成了数组元素长度的一半。
代码如下:
代码外层的大循环控制着所有排序回合,大循环内部两个小循环,第一个是奇数轮,从左到右,第二个偶数轮,从右到左,这样相当于第一个大循环只走两边,就将排序完成了,提高了很大的性能。