禅道 排序算法
这里用 Python 总结常用的几种排序算法
定期整理点滴,完善自己,今后给洋哥挣钱,陪伴着让我的小宝贝发自内心爱上笑,加油吧
插入排序
直译写法
def insert_sort(list):
n = len(list)
for i in range(1, n):
for j in range(i, 0, -1):
if list[j] < list[j - 1]:
list[j], list[j - 1] = list[j - 1], list[j]
else:
break
算法分析
上面的代码中,list[j], list[j - 1] = list[j - 1], list[j]
·这一步很费操作步骤,相当于执行三次复制,而且大小判断,需要每个循环遍历一遍,如果用赋值语句操作,采用附加条件,可以对算法进行优化
优化后写法
def insert_sort(list):
n = len(list)
for i in range(1, n):
key = list[i]
j = i - 1
while j >= 0 and list[j] > key:
list[j + 1] = list[j]
j -= 1
list[j + 1] = key
代码解析
在这个算法里,我们使用key
来存储外循环中第一个元素的值,创建j
变量代表当前元素的前一个元素的下标,我们使用while
循环,并用and
添加循环条件list[j] > key
,来判断当前元素是否比外循环中的当前元素key
大,这样能提前结束循环,不需要每个遍历一遍,保证算法效率,如果满足上面的条件,对当前元素进行赋值,较大元素保存在里面,接着让j - 1
后继续循环,当循环结束后,把key
存储到合适的位置,即list[j = 1]
此处。
选择排序
def select_sort(list):
n = len(list)
for i in range(n - 1):
min_index = i
for j in range(i + 1, n):
if list[min_index] > list[j]:
min_index = j
if i != min_index:
list[min_index], list[i] = list[i], list[min_index]
代码解析
我们用for
循环数据直至最后一个元素,在外循环中,首先假设第一个元素是当前数据的最小元素,用min_index
记录其下标,内循环开始遍历数据,从第i + 1
个元素开始,验证当前最小下标所代表的元素是否是所有数据中的最小元素,如果不是则进行交换,把实际最小元素的下标赋值给min_index
,最后的if
语句是为了容错处理,因为一开始假设把最小值下标赋给了min_index
,替换原来的值,直至外循环遍历结束。
冒泡排序
def bubble_sort(list):
n = len(list)
for i in range(n - 1):
count = 0
for j in range(n - i - 1):
if list[j] > list[j + 1]:
list[j], list[j + 1] = list[j + 1], list[j]
count += 1
if count == 0:
break
代码解析
冒泡排序是在两个元素间操作,外循环只有n - 1
次,定义count
变量来记录交换次数,内循环中为了不遍历先前已经排好的元素,range
的参数设置为n - i - 1
,再判断两个相邻元素的大小,如果当前元素大于下一个元素,则交换两个元素的值,接着继续记录count
,若count == 0
,序列已经有序
希尔排序
def shell_sort(list):
n = len(list)
gap = n // 2
while gap >= 1:
for i in range(gap, n):
j = i
while (i - gap) >= 0:
if list[i] < list[i - gap]:
list[i], list[i - gap] = list[i -gap], list[i]
j -= gap
else
break
gap //= 2
代码解析
可以将数组列在一个表中并对列分别进行插入排序,重复这过程,不过每次用更长的列来进行。最后整个表就只有一列了,我们选择增量gap = len // 2
,增量影响算法的性能
本篇尚未完
2018年9月12日18时于广州逸夫科学馆