zoukankan      html  css  js  c++  java
  • 基于python语言的经典排序法(冒泡法和选择排序法)

    每逢周末就遇雨期,闲暇之余,捣鼓了下python,心心念想学习,今天就在电脑上装了个2.7,学习了下经典算法,冒泡与选择排序法

    第一次写关于python的文章,说的不当之处,多多指正,我积极改正

    在之前,曾写过使用java和C语言实现该两种排序法,详情见https://www.cnblogs.com/hong-fithing/p/7615907.html

    搭建环境,准备工作就不冗余介绍了,网上搜罗一大堆

    目录

    冒泡排序法

    选择排序法

    冒泡排序法

    冒泡类似于汽水现象,摇动一下,就有很多泡往上冒,概念不多说,直接看一张执行的结果图,看图分析,如下

      图片中将每次的排序过程都打印出来,这样一看,就很简洁明了,比如第一次排序,相邻两个数进行比较,直到100大于2时,做了交换,然后没有数比100再大,所以100排在了最后,类似于找到了最大的值,第二次排序,就是找到第二大的值,并排在倒数第二个,依次类推

    代码实现比java简单,大众之言果然不假,没有java一些条件的限制,比如声明变量这些,python中是直接使用,见代码如下:

     1 #coding=utf-8
     2 lis = raw_input('请输入十个正整数:')
     3 arrays=[int(a) for a in lis.split()]
     4 print(arrays)
     5 for a in range(len(arrays)):
     6     for b in range(len(arrays)-1):
     7         if arrays[b] > arrays[b+1]:
     8             temp = arrays[b]
     9             arrays[b] = arrays[b+1]
    10             arrays[b+1] = temp
    11 for c in arrays:
    12     print(str(c)),

      这是很简单的排序,输入数据,通过for循环排序,输出结果,文前所贴图片,就是在该基础上加了几句代码,目的只是让排序过程更直观,代码如下:

    #coding=utf-8
    lis = raw_input('
    请输入十个正整数:')#2版本的需要使用raw_input输入
    arrays=[int(a) for a in lis.split()]    #将输入每个数以空格键隔开做成数组
    print("输入的十个整数为:") 
    print(arrays)                          
    for a in range(len(arrays)):            #取arrays的长度做为循环条件
        for b in range(len(arrays)-1):      #取arrays-1的长度做为循环条件
            if arrays[b] > arrays[b+1]:      #如果数组中的第一个值大于第二个值
                temp = arrays[b]             #则将大的值arrays[b]赋值在temp中
                arrays[b] = arrays[b+1]      #将小的值arrays[b+1]赋值在第一个值中
                arrays[b+1] = temp           #将temp中的值赋值在第二个值中,实现更换位置
        print("
    第%d" % (a + 1) + "次排序为:")
        for c in range(len(arrays)):        #循环获取数组的长度
            print arrays[c],                #打印排序的过程
    print("
    最终的排序为:")
    for c in arrays:                        #循环获取数组长度
        print str(c),                       #打印最终的排序结果,输入逗号是为了不换行显示

    在琢磨python的时候,遇到两个小问题,也是自己对python语言的不熟悉导致

    问题一:

      由于装的是2.7版本的python,input是需要使用raw_input来实现,在使用input函数的时候,运行程序就报File "<string>", line 1, in <module>错误

    问题二:

      使用print arrays[c]输出数组排序时,没有按一行输出,查看结果不直观,通过度娘查询,更多的是使用end来结束,发现该语言只支持3,然后查询到在输出语句后面加,逗号即可

    两个很小很小的问题,但对于我刚学习python还是琢磨了一番,所以在此记录下

    选择排序法

    冒泡排序磕磕绊绊成功后,选择排序法就相对简单一些了,排序逻辑上稍有些不同而已

    选择排序是将,最大或者最小值(依条件而定)与第一个值交换顺序,与冒泡不同,看如图所示:

      从图中可知,第一次排序中,是找到了最大的值100与第一位值交换了顺序,第二次排序,则是找到第二大的值与第二位交换顺序,以此类推

    直接看代码,如下:

     1 #coding=utf-8                           
     2 lis = raw_input('
    请输入十个正整数:')
     3 arrays=[int(a) for a in lis.split()]    
     4 print("输入的十个整数为:")           
     5 print(arrays)                         
     6 for a in range(0,len(arrays)-1):       
     7     max = arrays[a]                      #设定一个最大值max
     8     count = a                            #count是记住角标
     9     for b in range(a+1,len(arrays)):   
    10         if max < arrays[b]:              #如果默认的最大值小于数组值arrays[b]
    11             max = arrays[b]              #则将arrays[b]中的值赋值给max
    12             count = b                    #角标赋给count
    13     temp = arrays[a]                     #则将大的值arrays[a]赋值在temp中
    14     arrays[a] = arrays[count]            #将小的值arrays[count]赋值在第一个值中
    15     arrays[count] = temp                 #将temp中的值赋值在第二个值中,实现更换位置
    16 print("
    最终的排序为:")
    17 for c in arrays:                        #循环获取数组长度
    18     print str(c),                       #打印最终的排序结果,输入逗号是为了不换行显示

      这是实现选择排序的基本语法,再看如图所示的代码,如下:

     1 #coding=utf-8                            
     2 lis = raw_input('
    请输入十个正整数:')#2版本的需要使用raw_input输入,每个数之间用空格隔开
     3 arrays=[int(a) for a in lis.split()]    
     4 print("输入的十个整数为:")         
     5 print(arrays)                        
     6 for a in range(0,len(arrays)-1):        #取arrays-1的长度做为循环条件
     7     max = arrays[a]                      #设定一个最大值max
     8     count = a                            #count是记住角标
     9     for b in range(a+1,len(arrays)):    #取a+1,arrays的长度做为循环条件
    10         if max < arrays[b]:              #如果默认的最大值小于数组值arrays[b]
    11             max = arrays[b]              #则将arrays[b]中的值赋值给max
    12             count = b                    #角标赋给count
    13     temp = arrays[a]                     #则将大的值arrays[a]赋值在temp中
    14     arrays[a] = arrays[count]            #将小的值arrays[count]赋值在第一个值中
    15     arrays[count] = temp                 #将temp中的值赋值在第二个值中,实现更换位置
    16 for c in arrays:                        #循环获取数组长度
    17     print str(c),                       #打印最终的排序结果,输入逗号是为了不换行显示

      第一次使用python,看到了便捷之处,也看到了自身的短缺,需要更好的学习之。上述就是今天捣鼓的内容,内容不是很新奇,但很经典,面试过程大多都会问到。自然,这两个代码还有可优化之处,可增加中断循环,当已是有序的情况下,就跳出循环,节省排序时间,学习是个很有趣的过程,加油!

  • 相关阅读:
    取石子(斐波那契博弈)
    Kindergarten(网络流解法)
    最大团的一些定理
    Escape(多记一个方向状态的BFS)迷宫逃脱
    网络流的一些定理
    线段树维护动态连续子段HDU1540
    最大流Dinic(模板)
    MCMF最大流最小割(模板)Dijkstra负权优化
    Exchanging Gifts--2019CCPC哈尔滨 E题
    A<=B的前提下全排列A使答案尽量大
  • 原文地址:https://www.cnblogs.com/hong-fithing/p/9574693.html
Copyright © 2011-2022 走看看