排序算法
快速排序
'''
快排原理:
1. 选定一个中间值,默认是第一个值
2. 将小于这个中间值的数据放到左边
3. 将大于等于这个中间值的数据放到右边
4. 然后循环调用
5. 终止条件:列表中只剩一个元素时
'''
def sortq ( lst) :
if len ( lst) >= 2 :
mid = lst[ 0 ]
left = [ ]
right = [ ]
lst. remove( mid)
for i in lst:
if i < mid:
left. append( i)
else :
right. append( i)
return sortq( left) + [ mid] + sortq( right)
else :
return lst
if __name__ == '__main__' :
lst = [ 10 , 7 , 8 , 9 , 1 , 5 , 8 ]
print ( sortq( lst) )
选择排序
'''
选择排序:
原理:选定一个值为最小值,默认是第一个数字,后面的数字依次与这个值作比较,直到选出最小的放到最前面
1. 选择默认值作为第一个最小值
2. 进行筛选,筛选出最小值记录坐标和数值,与开头的数字交换位置
3. 循环筛选
'''
def sortc ( lst) :
for j in range ( len ( lst) ) :
min = lst[ j]
index = j
for i in range ( j+ 1 , len ( lst) ) :
if min > lst[ i] :
min = lst[ i]
index = i
lst[ j] , lst[ index] = min , lst[ j]
return lst
if __name__ == '__main__' :
lst = [ 10 , 7 , 8 , 9 , 1 , 5 , 8 ]
print ( sortc( lst) )
插入排序
'''
插入排序:
原理:从第二个值开始,依次与前面的值做比较,谁小,谁排在前面
'''
def sortiASC ( lst) :
for i in range ( 1 , len ( lst) ) :
for j in range ( i- 1 , - 1 , - 1 ) :
if lst[ j+ 1 ] < lst[ j] :
lst[ j+ 1 ] , lst[ j] = lst[ j] , lst[ j+ 1 ]
else :
break
return lst
def sortiDesc ( lst) :
for i in range ( len ( lst) - 2 , - 1 , - 1 ) :
for j in range ( i, len ( lst) - 1 ) :
if lst[ j] < lst[ j+ 1 ] :
lst[ j + 1 ] , lst[ j] = lst[ j] , lst[ j + 1 ]
else :
break
return lst
if __name__ == '__main__' :
lst = [ 10 , 7 , 8 , 9 , 1 , 5 , 8 ]
print ( sortiASC( lst) )
print ( sortiDesc( lst) )
希尔排序
'''
希尔排序:
原理:三层循环
1. 判断步长是否为0,为0则排序完毕
2. 步长为起始下标,确定临时值和同组的下标
3. 同组比较,下标>=0,且前面的值大于后面的值,就将大的值插到后面的位置
'''
def sortShell ( lst) :
n = len ( lst)
mid = int ( n/ 2 )
while mid > 0 :
for i in range ( mid, n) :
temp = lst[ i]
j = i- mid
while j >= 0 and lst[ j] > temp:
lst[ j+ mid] = lst[ j]
j -= mid
lst[ j+ mid] = temp
mid = int ( mid/ 2 )
return lst
if __name__ == '__main__' :
lst = [ 10 , 7 , 8 , 9 , 1 , 5 , 8 ]
print ( sortShell( lst) )
归并排序
'''
归并排序:
1. 将列表不断分成两组,直到长度为1
2. 比较两个列表的值的大小,小的放在前面
3. 在分组进行到最后的时候,会进行排序
'''
def sortMerge ( lst) :
if len ( lst) <= 1 :
return lst
num = int ( len ( lst) / 2 )
left = sortMerge( lst[ : num] )
right = sortMerge( lst[ num: ] )
return merge( left, right)
def merge ( left, right) :
r, l = 0 , 0
result = [ ]
while l < len ( left) and r < len ( right) :
if left[ l] <= right[ r] :
result. append( left[ l] )
l += 1
else :
result. append( right[ r] )
r += 1
result += list ( left[ l: ] )
result += list ( right[ r: ] )
return result
if __name__ == '__main__' :
lst = [ 10 , 7 , 8 , 9 , 1 , 5 , 8 ]
print ( sortMerge( lst) )