• python数据结构与算法——冒泡排序


    用两种方式实现,非递归和递归

    直接上代码:

    先是失败的递归方式,涉及到对象引用的问题:

     1 # Bad  想一想为啥不行?
     2 def bubblesort_rec_bad(A):
     3     if len(A)==1:    # 只剩一个数时 直接返回结束递归
     4         return
     5 
     6     for j in range(len(A)-1):
     7         if A[j] < A[j+1]:   # 依次比较两个相邻的数
     8             A[j], A[j+1] = A[j+1], A[j]     #交换两个相邻的数
     9 
    10     # 比较余下n-1个数
    11     bubblesort_rec_bad(A[:-1])  # <<关键在与深复制的问题

    下面是运行结果

        # 错误递归
        A = [12,35,99,16,76]
        bubblesort_rec_bad(A)
        print "bad rec: ",A
        
        >>>bad rec:  [35, 99, 16, 76, 12]

    递归调用的参数传递中,A[:-1] 表示列表A的前n-1个元素,并将其值复制一份获得一个新的列表(:),

    用C语言说,传入的其实是形参

    正确的递归方式可以这样子弄:

    1 def bubblesort_rec(A,i):
    2     if i==1:    # 只剩一个数时 直接返回结束递归
    3         return
    4     for j in range(i-1):
    5         if A[j] < A[j+1]:   # 依次比较两个相邻的数
    6             A[j], A[j+1] = A[j+1], A[j]     #交换两个相邻的数
    7     # 比较余下n-1个数
    8     bubblesort_rec(A,i-1)

    结果:

    # 正确递归
        A = [12,35,99,16,76]
        bubblesort_rec(A, len(A))
        print "good rec:",A
    
    good rec: [99, 76, 35, 16, 12]

    不用递归也是可以的,用两层循环

    1 # 冒泡排序 二层循环格式
    2 def bubblesort(A):
    3     n = len(A)
    4     for i in range(n,1,-1): # i = n, n-1, n-2, ..., 2
    5         # 截取 A 的前i个元素进行冒泡
    6         for j in range(i-1):
    7             if A[j] < A[j+1]:   # 依次比较两个相邻的数
    8                 A[j], A[j+1] = A[j+1], A[j]     #交换两个相邻的数
     # 循环格式
        A = [12,35,99,16,76]
        bubblesort(A)
        print "no rec:  ",A
    
    >>>no rec:   [99, 76, 35, 16, 12]
  • 相关阅读:
    常用排序算法及java语言实现
    机器学习实战笔记(python3实现)01--概述
    笔试错题--(字符串常量池和JVM运行时数据区)
    笔试错题(典型题)
    java进阶--java网络编程
    01_Java基础_第1天(Java概述、环境变量、注释、关键字、标识符、常量)
    数据库3(DBUtils)
    数据库2(JDBC、DBUtils)
    数据库1(数据库、表及表数据、SQL语句)
    Linux的基本命令
  • 原文地址:https://www.cnblogs.com/hanahimi/p/4692281.html
Copyright © 2020-2023  润新知