排序算法虽然在平常的工作中也许用不到,但是对于加强自身的逻辑思维能力以及加深对数据结构的理解有不错的效果。下面是用python3实现的部分排序算法。
1.冒泡排序法
冒泡排序的基本思想是将相邻的元素进行比较,如果是从小到大排序的话,则将小的元素放在左边,这种排序的思想很像水中的气泡上浮,所以称为冒泡排序。
def bubble_sort(alist):
"""冒泡排序"""
n = len(alist)
# 2. 控制遍历的次数
for j in range(n-1): # 1
# 1. 先控制角标 i 的变化
exchange = False
for i in range(0,n - 1 - j):
# 判断角标 i 和 i+1对应的值的大小
if alist[i] > alist[i+1]:
# 交换
alist[i],alist[i+1] = alist[i+1],alist[i]
exchange = True
if not exchange:
break
选择排序的基本思想是从无序序列中遍历出最小的元素,放在序列的第一个位置,即下标为0的位置,然后再次遍历,从剩下的元素中再次找到最小的元素,放在下标为1的位置,依次类推,最终完成排序。
def select_sort(alist):
"""选择排序"""
n = len(alist)
# 控制比较的次数
for j in range(n-1):
# 控制角标
min_index = j
for i in range(1+j,n):
# 比较
if alist[i] < alist[min_index]:
# 修改 min_index 对应的值
min_index = i
if min_index != j:
# 交换
alist[min_index],alist[j] = alist[j],alist[min_index]
3.插入排序
插入排序的基本思想是将一个序列看成两部分:左边的部分是有序序列,右边的是待排序序列。每次分别比较有序和待排序序列元素的大小,然后插入到合适位置,完成排序。
def insert_sort(alist):
"""插入排序"""
n = len(alist)
for j in range(1,n):
for i in range(j,0,-1):
if alist[i] < alist[i - 1]:
# 交换
alist[i],alist[i-1] = alist[i-1],alist[i]
else:
break
希尔排序实际上是对插入排序的一个优化排序算法,先通过将源序列按某个下标增量分割成若干子序列,分别进行插入排序,然后让下标增量递减,每个子序列中的关键字就会增加,当增量递减为1时,再进行一次插入排序,完成了排序。
def shell_sort(alist):
n = len(alist)
# 控制增量的变化
gap = n // 2
while gap >= 1:
# shell 排序是对于插入排序的优化
for i in range(gap, n):
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 = gap // 2
快速排序的基本思想是取序列中的一个元素作为"基准",然后将比该"基准"小的元素放在它左边,将比它大的元素放在右边,和它相等的元素放在任意一边均可,想放哪边全由编写代码时决定,然后通过递归调用,对两边的序列分别排序,最终变成有序序列。
ef quick_sort(alist,start,end):
# 自己的调用自己,退出递归的条件 maximum recursion depth exceeded in comparison
if start > end:
# 结束递归
return
n = len(alist)
left = start
right = end
base_value = alist[left]
while left < right:
# = 添加任何一个判断都可以,但是 '=' 决定了相同的基准值应该放在哪一边
while left < right and alist[right] >= base_value:
right -= 1
# 退出循环 将 right 角标对应的值设置给 left 角标
alist[left] = alist[right]
while left < right and alist[left] < base_value:
left += 1
# 将 left 角标对应的值设置给 right 角标
alist[right] = alist[left]
# 退出循环 left = right
alist[left] = base_value
# 递归调用
# quick_sort(alist[:left])
# quick_sort(alist[left+1:])
# 先对于左变的序列完成快速排序
quick_sort(alist,start,left-1)
quick_sort(alist,left + 1,end)
以上就是本次博客的全部内容了,由于是初次写博客,多多包涵,有不正确的地方还请指正。