前言:什么是排序,什么是算法?
1.排序(Sort)
- 将杂乱无章的数据元素,通过一定的方法按关键字顺序排列的过程叫做排序。目的是将一组“无序”的记录序列调整为“有序”的记录序列,比如说升序、降序、奇偶排序(奇升偶降、奇降偶升)等。
2.算法(Algorithm)
- 指解题方案的准确而完整的描述,是一系列解决问题的清晰指令。代表着用系统的方法描述解决问题的策略机制。一个算法的优劣可以用空间复杂度与时间复杂度来衡量,常用的算法有递推法、递归法、穷举法、贪心算法、分治法、动态规划法、迭代法、分支界限法、回溯法等
3.常用排序算法
术语解读:
-
时间复杂度
执行算法所需要的计算工作量(耗费的时间),一般来说,计算机算法是问题规模n 的函数f(n),记做T(n)=Ο(f(n))
- 渐进时间复杂度:问题的规模n 越大,算法执行的时间的增长率与f(n) 的增长率正相关
- 冒泡排序:问题规模为n,需要比较n次,所以平均时间复杂度为O(n²)
- 归并排序:问题规模通过分治法消减为logN次,所以时间复杂度平均O(nlogn)
-
空间复杂度
指执行算法所需要消耗的内存空间,其计算和表示方法与时间复杂度类似,一般都用复杂度的渐近性来表示
-
排序方式1
- 内排(In-place):所有操作都在内存中完成。
- 外排(Out-place):由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行。
-
排序方式2
- 比较排序:通过元素间相互比较确定位置得到排序结果。如冒泡排序、归并排序、快速排序、堆排序。
- 非比较排序:通过确定每个元素位置之前,应该有多少个元素来排序,针对数组arr,计算arr[i]之前有多少个元素,则唯一确定了arr[i]在排序后数组中的位置。如计数排序、基数排序、桶排序等。
-
小结
比较排序适用大多数的场景。非比较排序时间复杂度低,但由于非比较排序需要占用空间来确定唯一位置。所以对数据规模和数据分布有一定的要求。
-
稳定性
-
稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面;
-
不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面;
-
-
额外补充
-
k:"桶"的个数
-
O(log n):算法中log级别的时间复杂度都是由于使用了分治思想,底数a由分治的复杂度决定,二分法a=2,三分法a=3,不过无论底数是什么,log级别的渐进意义是一样的。
-
大O的定义体现的是一个极限的思想。我们先考虑O(logx(n))和O(logy(n)),x!=y,再考虑n趋于无穷的情况。求当n趋于无穷大时logx(n)/logy(n)的极限可以发现,极限等于lny/lnx,也就是一个常数,也就是说,在n趋于无穷大的时候,这两个东西仅差一个常数。所以从研究算法的角度log的底数不重要。
*
-
正片开始:
- [交换排序]冒泡排序(Bubble Sort)
- [交换排序]快速排序(Quick Sort)
- [插入排序]普通插入排序(Insertion Sort)
- [插入排序]希尔排序(Shell Sort)
- [选择排序]简单选择排序(Selection Sort)
- [非比较类排序]计数排序(Counting Sort)
未完待续,同步更新…
[选择排序]堆排序(Heap Sort)
[归并排序]二路归并排序(Merge Sort)
[归并排序]多路归并排序(Merge Sort)
[非比较类排序]桶排序(Bucket Sort)
[非比较类排序]基数排序(Radix Sort)