算法导论中提到了七种排序算法,再加上冒泡排序、选择排序、希尔排序,构成我们常说的十大排序算法。其中冒泡、选择、插入、希尔、归并、堆、快速排序都是比较排序算法(即通过对元素进行大小比较来确定顺序);计数、基数、桶排序都是非比较排序算法。十大排序算法的性能比较如下表:
下面将简单描述十大排序算法的原理,并分别用python实现。笔记自用就不附原理图了,如果对原理有疑问请参阅算法导论那本书,里面算法运行过程图解是非常清楚的。
1.冒泡排序
比较相邻两个数,若前面的数比后面的数大,则交换位置。每一轮最大的数沉底,越小的数就能逐渐换到数组的前面,就像冒泡一样,因此称为冒泡排序。
def BubbleSort(a):
n=len(a)
for i in range(n):
for j in range(n-i-1):
if a[j]>a[j+1]:
a[j],a[j+1]=a[j+1],a[j]
2.选择排序
遍历数组,找到最小值,交换最小值和第一个数的位置。然后从第二个数开始遍历,以此类推。
def SelectionSort(a):
n=len(a)
for i in range(n):
min=i
for j in range(i+1,n):
if a[j]<a[min]:
min=j
a[i],a[min]=a[min],a[i]
3.插入排序
(书2.1节,9页开始)插入排序很像排序扑克牌。拿到一张牌,与前面的牌比较,插入合适的位置,这个位置原来的牌后移。但是每次只移动一位。
def InsertionSort(a):
n=len(a)
for j in range(1,n):
key=a[j]
i=j-1
while i>=0 and a[