数据结构python-第六节
希尔排序
希尔排序原理
希尔排序shell sort是插入排序的一种,也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序:随着增量逐渐减少,每组增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分为一组,算法便终止。
基本思想是:将数组列在一个表中并对列分别进行插入排序,重复这过程,不过每次用更长的列来进行。最后整个表就只有一列了,将数组转换至表时为了更好的理解这算法,算法本身还是使用数组进行排序
希尔排序原理为改进的插入排序算法,首先取一个间隔,将间隔的数进行插入排序。优点在于:间隔大时排序次数少,间隔小时排序距离短。再缩小间隔再次进行排序,最后实行插入排序。
希尔排序举例
例如,假设有这样一组数[13,14,94,33,82,25,59,94,65,23,45,27,73,25,39,10],如果我们以步长为5开始进行排序,我们可以通过将这列表放在有5列的表中来更好的描述算法,这样他们就应该看起来是这样(竖着的元素是步长组成):
13,14,94,33,82
25,59,94,65,23
45,27,73,25,39
10
然后我们对每列进行排序
10 14 73 25 23
13 27 94 33 39
25 59 94 65 82
45
将上述四行数字,依次序接在一起时,我们得到 10 14 73 25 23 13 27 94 33 39 25 59 94 65 82 45,这时10已经移到正确的位置了,然后再以3位步长进行排序
10 14 73
25 23 13
27 94 33
39 25 59
94 65 82
45
排序后
10 14 13
25 23 33
27 25 59
39 65 73
45 94 82
94
连接后
10 14 13 25 23 33 27 25 59 39 65 73 45 94 82 94
最后,对此数组进行插入排序。
希尔排序代码实现
a=[54,26,93,17,77,31,44,55,20]
def shell_sort(list):
n = len(list)
gap = n // 2
while gap >0:
for i in range(gap,n):
j = i
while j>0:
if list[j]<list[j-gap]:
list[j],list[j-gap]=list[j-gap],list[j]
j -= gap
else:
break
gap //=2
print(a)
shell_sort(a)
print(a)
快速排序
快速排序原理
先定义两个指针,一个在最前面,一个在最后面,第一次要对数组进行划分,先找出个中间数,一般默认把第一个数作为中间数然后从后往前找比中间数小的,把他放在前一个指针的位置,在从前往后找比中间数大的,找到后把它放在第二个指针在位置,直到前面和后面的指针指向同一个位置,我们就把中间值放在这里即可,这样根据中间数,把整个需要排序的数组分为两部分,前一个部分都小于中间数,后一部分都大于中间数,此时这两部分的数还是无序的,最后递归调用排序方法,对两部分分别进行排序即可。
举例:
快速排序代码实现
def quick_sort(list,first,last):
"""快速排序"""
if first >= last:
return
n = len(list)
mid_value = list[first]
low = first
high = last
while low<high:
while low<high and list[high]>=mid_value:
high -= 1
list[low] = list[high]
# low +=1
while low<high and list[low]<mid_value:
low += 1
list[high] = list[low]
# high -= 1
list[low]=mid_value
# 对low左边的列表执行快速排序
quick_sort(list,first,low-1)
# 对low右边的列表执行快速排序
quick_sort(list,low+1,last)
if __name__ == '__main__':
a=[54,26,93,17,77,31,44,55,20]
print(a)
quick_sort(a,0,len(a)-1)
print(a)