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:决定每层循环的次数很重要,需要仔细思考

原文地址:https://www.cnblogs.com/hyj691001/p/10317842.html

时间: 2024-10-12 02:58:37

20190125-找到列表第二大的数以及自己写一个冒泡排序的相关文章

大神手把手教你写一个页面模板引擎,只需20行Javascript代码!

只用20行Javascript代码就写出一个页面模板引擎的大神是AbsurdJS的作者,下面是他分享的全文,转需. 不知道你有木有听说过一个基于Javascript的Web页面预处理器,叫做AbsurdJS.我是它的作者,目前我还在不断地完善它.最初我只是打算写一个CSS的预处理器,不过后来扩展到了CSS和HTML,可以用来把Javascript代码转成CSS和HTML代码.当然,由于可以生成HTML代码,你也可以把它当成一个模板引擎,用于在标记语言中填充数据. 于是我又想着能不能写一些简单的代

查找序列中第二大的元素

这个问题,感觉很简单,一看就可能首先想到几种方法,例如: 首先对这个序列进行排序,然后取第二个位置的元素:或者循环遍历元素序列,找到最大的元素,然后将其移除.再重复此过程,得到第二大的元素. 但是都没有考虑其效率.下面提出一种方法: <span style="font-size:14px;">package algrithm; public class secondbignum { public static void main(String[] args) { int [

如何找出数组中第二大的数

1.最容易想到的办法 我们可以用最简单的办法来找到一个数组中任意大小的数字,那就是按照某一个排序方式将数组的所有元素进行排序,然后按需取出来就可以,知识这种方式的时间复杂度和空间复杂度比较大,所以,有了下面这种方式 2.通过设置两个变量来进行判断 这种方式可以只通过一遍扫描数组即可找到第二大数,具体的形式如下:先定义两个变量:一个变量用来存储数组的最大数,初始值为数组首元素,另一个变量用来存储第二大的数,初始值为最小负整数,然后遍历数组元素,如果数组元素的值比最大数变量还大,更新最大数:若数组元

第二大整数

第二大整数 问题描述 编写一个程序,读入一组整数(不超过20个),当用户输入0时,表示输入结束.然后程序将从这组整数中,把第二大的那个整数找出来,并把它打印出来.说明:(1)0表示输入结束,它本身并不计入这组整数中.(2)在这组整数中,既有正数,也可能有负数.(3)这组整数的个数不少于2个. 输入格式:输入只有一行,包括若干个整数,中间用空格隔开,最后一个整数为0. 输出格式:输出第二大的那个整数. 输入输出样例 样例输入 5 8 -12 7 0 样例输出 7 #include <stdio.h

面试算法题:16个数,最多用20次比较,找出第二大的数?

这道题最笨的方法就是先从16个数中选出最大的数,然后再从剩下的15个数中选出最大数就可得到答案,因此,需要15+14=29次比较. 既然这道题要求在20次比较之内就能找出第二大的数,那我们就想能简单的方法. 假设16个数中最大的是A,第二大的是B. 首先将16个数两两进行比较,较大者胜出,然后再在胜出者中进行两两比较,按此方法,最后选出最大数A,如下所示 红色路线是最大数经过的路径. 接下来分析B可能存在的位置. 将16个数分为左部分和右部分各8位: 1.如果A和B在两个不同的部分(A在左部分,

算法:寻找数组的第二大的元素(不排序、只循环一次)

该算法的原理是,在遍历数组的时,始终记录当前最大的元素和第二大的元素.示例代码: package demo01 import ( "fmt" ) func NumberTestBase() { fmt.Println("This is NumberTestBase") nums := []int{12, 24, 2, 5, 13, 8, 7} fmt.Println("nums:", nums) secondMax := getSecondMax

C语言 &#183; 第二大整数

算法提高 第二大整数 时间限制:1.0s   内存限制:512.0MB 问题描述 编写一个程序,读入一组整数(不超过20个),当用户输入0时,表示输入结束.然后程序将从这组整数中,把第二大的那个整数找出来,并把它打印出来.说明:(1)0表示输入结束,它本身并不计入这组整数中.(2)在这组整数中,既有正数,也可能有负数.(3)这组整数的个数不少于2个. 输入格式:输入只有一行,包括若干个整数,中间用空格隔开,最后一个整数为0. 输出格式:输出第二大的那个整数. 输入输出样例 样例输入 5 8 -1

获得第二大的元素

#include<iostream> using namespace std; int main() { int s1 = 1; unsigned int s2 = 1; cout<<(s1<<31)<<endl; ///这是把i左移两位,左移的规则只记住一点:丢弃符号位,0补最低位!如果移动的位数超过了该类型的最大位数,那么编译器会对移动的位数取模.如对int型移动33位,实际上只移动了332=1位. cout<<(s2<<31)&

虚拟化霸主完成产品转型,组建云计算第二大阵营联盟

(上图为VMware全球CEO Pat Gelsinger) "合纵连横"的策略起源于春秋战国时期.最初,齐.秦两国实力最为强大,其它五国时而"合纵"起来联合对付齐秦二国,而齐秦二国也时不时拉拢其它五国,"连横"起来共同对付其它国家.众小国之间联盟的合纵术,以及小国与大国之间结盟的连横术,就成为乱世时期"列强"争霸的经典策略. 从2006年开始的云计算第一个十年,是一个全球技术产业"乱世"的开始.在这个十年