zoukankan      html  css  js  c++  java
  • 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:决定每层循环的次数很重要,需要仔细思考

     

     

     

     

     

  • 相关阅读:
    UnityShaderVariant的一些探究心得
    NGUI在使用AssetBubble 出现材质丢失错误的情况
    [转] unity调试lua工具和方法
    各种文件的mime类型
    Javascript 随机数
    jQuery文字上下滚动
    Asp.Net Color转换
    Asp.Net 清除Html标签
    jQuery Ajax实例
    Asp.Net Cookie用法
  • 原文地址:https://www.cnblogs.com/hyj691001/p/10317842.html
Copyright © 2011-2022 走看看