排序算法简介
我们通常所说的排序算法是指内部排序算法,即数据记录在内存中进行排序
排序算法大体可分为两种:
一种是比较排序,时间复杂度O(nlogn)~O(n^2),主要有:冒泡排序,选择排序,插入排序,归并排序,堆排序,快速排序等。
另一种是非比较排序,时间复杂度可以达到O(n),主要有:计数排序,基数排序,桶排序等。
下面介绍比较排序算法.
比较排序算法的性能表
排序方法 | 平均情况 | 最好情况 | 最坏情况 | 辅助空间 | 稳定性 |
---|---|---|---|---|---|
冒泡排序 | O(n^2) | O(n) | O(n^2) | O(1) | 稳定 |
简单选择排序 | O(n^2) | O(n^2) | O(n^2) | O(1) | 不稳定 |
直接插入排序 | O(n^2) | O(n) | O(n^2) | O(1) | 稳定 |
希尔排序 | O(nlogn)~O(n^2) | O(n^1.3) | O(n^2) | O(1) | 不稳定 |
堆排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(1) | 不稳定 |
归并排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(n) | 稳定 |
快速排序 | O(nlogn) | O(nlogn) | O(n^2) | O(nlogn)~O(n) | 不稳定 |
有一点容易忽略的是排序算法的稳定性(腾讯校招2016年笔试题曾考过)
排序算法稳定性的简单形式定义为:如果Ai=Aj,排序前Ai在Aj之前,排序后保持Ai在前,Aj在后,则称此种排序算法是稳定的。换句话说,即是保证前后两个相等的数的相对位置不变。
排序算法是否稳定的是由具体算法决定的,不稳定的算法在某种条件下可以变成稳定的算法,而稳定的算法在某种条件下也可以变为不稳定的算法。例如对于冒泡排序,原本稳定的排序算法,如果将记录交换的条件改成A[i]>=A[i+1],则两个相等的记录就会交换位置,从而变成不稳定的排序算法。
排序算法稳定性的好处:排序算法稳定,前一个键上排序的结果可为后一个键所用。
冒泡排序(Bubble Sort)
冒泡排序算法比较简单易学,其思路是:遍历所有元素,依此比较相邻两个元素,如果他们的顺序不满足设定的要求,交换它们的位置,直到没有元素需要交换,排序完成。此算法的名称由来是因为越小(或越大)的元素经由交换慢慢“浮”到数列的顶端。
如下是冒泡算法排序的代码(python):
冒泡算法升序排序
@someone
def bubbleSortA(data):
for i in range(0,len(data)):
for j in range(0,len(data)-1):
if data[j]>data[j+1]:
data[j],data[j+1]=data[j+1],data[j]
return data
冒泡算法绛序排序
def bubbleSortA(data):
for i in range(0,len(data)):
for j in range(0,len(data)-1):
if data[j+1]>data[j]:
data[j],data[j+1]=data[j+1],data[j]
return data
上述代码对序列data=[6,5,3,1,8,7,2,4]的结果分别为:
In: data=[6,5,3,1,8,7,2,4]
In: bubbleSortA(data)
Out: [1,2,3,4,5,6,7,8]
In: bubbleSortJ(data)
Out: [8,7,6,5,4,3,2,1]
动态效果如图: