首先什么是山型排序,就是把一个列表做中间数值大,两边数值小的样子,假如这个序列如下:
5, 1, 6, 2, 7, 14, 12, 19, 16, 30, 17, 27, 22, 26, 28, 31, 25
如何排序呢,不多说,直接上代码,封装一个排序文件,定义好排序的类:
class Bubble:
#类标注
'''
冒泡排序类
'''
def __init__(self):
'''
初始化函数
'''
pass
def sort_from_big(self, lst):
#函数标注
'''
倒序排列
'''
ret = self.sort_from_little(lst)
#正序排列后的倒序输出
return ret[::-1]
@classmethod
def sort_from_little(self, lst):
'''
类函数
正序排列
'''
#参数检测,入参检测
if not isinstance(lst, (list,tuple)):
raise TypeError('参数必须为列表或元祖')
if len(lst) < 2:
raise ValueError('列表中数据数量至少有2个')
for data in lst:
if not isinstance(data, int):
raise ValueError("数据必须为int类型")
#防止传入tuple,无法做交换操作
tmp = list(lst)
#排序
for i in range(len(tmp) - 1):
for j in range(i,len(tmp)-1):
if tmp[j] > tmp[j+1]:
tmp[j],tmp[j+1] = tmp[j+1],tmp[j]#交换
return tmp
调用文件代码如下:
from bubble import Bubble
# 查看函数标注
# help(Bubble)
# help(Bubble.sort_from_little)
# help(Bubble.sort_from_big)
#建立元祖(测试传入元祖会不会报错)
num_list = (5, 1, 6, 2, 7, 14, 12, 19, 16, 30, 17, 27, 22, 26, 28, 31, 25)
print('原始数据:', num_list)
#类函数可直接使用
num_from_little = Bubble.sort_from_little(num_list)
print('从小到大排列(类函数):', num_from_little)
#实例化使用
bbb = Bubble()
num_from_big = bbb.sort_from_big(num_list)
print('从大到小排列(实例化):', num_from_big)
#切片,从0开始,每2个数取一个
mountain = num_from_little[::2]
print(mountain)
#切片,先从1开始,每2个数取一个;然后倒序;然后附加在mountian后边
mountain.extend(num_from_little[1::2][::-1])
print('山形输出:', mountain)
总结需要注意的地方
1.入参检测,不清楚传入的是touple还是list,所以要检查,防止不能进行排序而出错
2.切片操作很巧妙,列表后边加[::-1] 直接就是对列表倒叙排列
3.为保证山形排序,排除的山高低圆滑,使用切片操作将排序好的列表按照2个取一个方取出来,再将后部分倒叙配接,这个方法很巧妙