《算法》系列,是面向《算法》第四版这本书进行学习,会去除繁琐的文字叙述,会从以下两个方面去理解一个算法:
1、这个算法是什么?
2、这个算法怎么用?
整个系列会使用python作为编程语言,避免看着文本抄袭的麻烦。一些关于《算法》这本书的学习方法可以参考:算法学习之路
选择排序
属于不稳定排序
步骤:
1、找到数组中最小的元素
2、将它和第一个元素交换位置
3、再从剩下的元素中找到最小的元素,将它和第二个元素进行交换,如此往复
def select(lists):
count = len(lists)
for i in range(count):
min = i
for j in range(i+1,count):
if lists[j] < lists[min]:
min = j
lists[min], lists[i] = lists[i], lists[min]
return lists
if __name__ == "__main__":
print (select([1,3,3,2,8,3,4,5,6]))
插入排序
属于稳定排序
相当于抓牌,将每一张牌放到相应位置
步骤:
选一个key,对比前面的数字,进行交换
def insert_sort(arr):
for i in range(1,len(arr)):
key = arr[i]
left = i
for j in reversed(range(left)):
if arr[j] > key:
arr[j+1] = arr[j]
arr[j] = key
return arr
if __name__ == "__main__":
print (insert_sort([1,4,23,5,3,4,5,9,32,2]))
希尔排序
不稳定排序,平均nlog(n)
希尔排序(Shell’s Sort)是插入排序的一种,相对于插入排序只能相邻之间交换,希尔排序可以在子序列中进行交换。
希尔排序对于中等大小的数组的运行时间是可以接受的,出来对于很大的N,其他算法可能比希尔排序快两倍,而且更复杂。
步骤:
1、把记录按步长gap分组,对每组记录采用直接插入排序方法进行排序
2、随着步长逐渐减小,所分成的组包含的记录越来越多
3、当步长值减小到1时,整个数据合成一组,构成一组有序记录,完成排序
def shell_sort(alist):
n = len(alist)
gap = n // 2
while gap >= 1:
for j in range(gap, n):
i = j
while (i - gap) >= 0:
if alist[i] < alist[i - gap]:
# 交换
alist[i], alist[i - gap] = alist[i - gap], alist[i]
# 修改i
i = i - gap
else:
break
gap //= 2
if __name__ == '__main__':
print(shell_sort([6, 7, 5, 3, 4, 1, 8]))
公众号:算法手记