20190125-找到列表第二大的数以及自己写一个冒泡排序
1. 给定一个列表,找出列表第二大的值
思路:考虑列表是可能是乱序列表,并且可能存在两个相等的最大值的情况。
s1 = [34,33,2,1,6,7,7,44,3,23,23]
解法1:去重(解决可能存在两个相等的最大值),然后使用sort排序,然后然后通过切片取到第二大的值。tip,一定要先去重再排序,如果先排序再去重可能会打乱序列
s1 = [34,33,2,1,6,7,7,44,3,23,23] s2 = list(set(s1)) s2.sort() print(s2[-2]) #s2[-2]即为列表第二大的值
解法2:自己定义2个变量,与列表中的值一一对比,考虑对比的i的值大于最大值,以及处于最大值与第二大值之间的情况
def find_the_second_max_value(s): if isinstance(s,list): first_max_value=s[0] second_max_value=s[0] for i in range(len(s)): if s[i]>=first_max_value: second_max_value=first_max_value first_max_value=s[i] elif s[i]<first_max_value and s[i]>=second_max_value: second_max_vaule=s[i] return second_max_value else: return false print(find_the_second_max_value(s1))
发散思考:自己写一个冒泡排序
冒泡排序思路
第一轮
s1 = [34,33,2,1,6,7,7,44,3,23,23]
第一步:34>33====》s1=[33,34,2,1,6,7,7,44,3,23,23]
第二步:34》2====》s1=[33,2,34,1,6,7,7,44,3,23,23]
第三步:34》1====》s1=[33,2,1,34,6,7,7,44,3,23,23]
一直比较到最后一位数,那么s1[0]和所有的数都比较了,第一轮比较结果为s1 = [33,2,1,6,7,7,44,3,23,23,34]
第二轮
s1 = [33,2,1,6,7,7,44,3,23,23,34]
第一步:33>2====》s1=[2,33,1,6,7,7,44,3,23,23,34]
第二步:33>1====》s1=[2,1,33,6,7,7,44,3,23,23,34]
第三步:33>6====》s1=2,1,6,33,7,7,44,3,23,23,34]
一直比较到最后一位数,那么s1[0]和所有的数都比较了,第二轮比较结果为s1 = [2,1,6,7,7,44,3,23,23,33,34],需要注意的一点是第二轮比较的步数应该比第一轮比较的步数少1,即33比较到最后一个23即可,因为33和34在第一轮已经比较过了
因此整体考虑使用两层循环来思想,第一层循环负责比较的轮数len(s)次,第二层循环负责每轮比较的步数len(s)-1-j次
def bubble_order(s,reverse=none): if reverse==none or reverse==false: for j in range(len(s)): for i in range(len(s)-1-j): if s[i]>s[i+1]: temp = s[i+1] s[i+1]=s[i] s[i]=temp elif reverse ==true: for k in range(len(s)): for l in range(len(s)-1-k): if s[l]<s[l+1]: temp = s[l+1] s[l+1]=s[l] s[l]=temp return s
tips:决定每层循环的次数很重要,需要仔细思考