【问题标题】:Sorting three numbers in ascending order without using functions不使用函数按升序对三个数字进行排序
【发布时间】:2021-01-04 09:43:40
【问题描述】:

我的任务之一是编写一个 python 程序,它可以不使用任何函数,如 sort 或 swap,按升序对三个数字进行排序。

这是我想到的第一件事:

a = float(input("Enter a: "))
b = float(input("Enter b: "))
c = float(input("Enter c: "))
if a < b:
    if b < c:
        print (a, "<", b, "<", c)
    else:
        if a < c:
            print (a, "<", c, "<", b)
        else:
            print (c, "<", a, "<", b)
else:
    if c < b:
        print (c, "<", b, "<", a)
    else:
        if c < a:
            print (b, "<", c, "<", a)
        else:
            print (b, "<", a, "<", c)

我的老师说要尝试简化它,所以我接下来写了这个(这基本上是使用交换的一种迂回方式):

a = float(input("Enter a: "))
b = float(input("Enter b: "))
c = float(input("Enter c: "))
if a > c:
    a = a + c
    c = a - c
    a = a - c  
if a > b:
    a = a + b
    b = a - b
    a = a - b
if b > c:
    b = b + c
    c = b - c
    b = b - c
print (a, "<", b, "<", c)

所以我想我的问题是它是否可以比这更简化以及它会是什么样子。

【问题讨论】:

  • 你可以用a,b = b,a交换两个号码
  • 第二个版本是可读性的灾难。听@khelwood

标签: python


【解决方案1】:

我认为在第二个代码中使用您的方法,这是最简单的方法:

a = float(input("Enter a: "))
b = float(input("Enter b: "))
c = float(input("Enter c: "))

if a > b:
    a,b = b,a
if a > c:
    a,c = c,a
if b > c:
    b,c = c,b
    
print (a, "<", b, "<", c)

【讨论】:

    【解决方案2】:

    不确定这是否是您想要的,但您可以使用列表并像这样对它们进行排序:

    for i in range(len(num)):
        for j in range(i+1, len(num)):
            if(num[i] > num[j]):
                temp = num[i]
                num[i] = num[j]
                num[j] = temp
    print(num)
    
    

    【讨论】:

      【解决方案3】:

      不简单,但更短......

      a=[int(input("First Number: ")),int(input("Second Number: ")),int(input("Third Number: "))]
      for x in range (0,len(a)):
          for i in range (0,(len(a))-1):
              if a[i]>a[i+1]:
                  a[i],a[i+1] = a[i+1],a[i]
      print ("Little to Bigger Sort:",a)
      

      【讨论】:

        【解决方案4】:

        保留你的概念,我会选择这样的东西(不要使用这个版本,因为你的交换概念仍然需要修复 - 请参阅下面的 @thierry-lathuille 的 cmets):

        a = float(input("Enter a: "))
        b = float(input("Enter b: "))
        if a > b:
            a = a + b
            b = a - b
            a = a - b
        c = float(input("Enter c: "))
        if b > c:
            b = b + c
            c = b - c
            b = b - c
            if a > b:
                a = a + b
                b = a - b
                a = a - b
        print (a, "<", b, "<", c)
        

        这种方式大多数情况下只会导致两个 if 语句而不是三个

        结合@khelwood 推荐的正确a, b = b, a 交换符号,我们得到:

        a = float(input("Enter a: "))
        b = float(input("Enter b: "))
        if a > b:
            a, b = b, a
        c = float(input("Enter c: "))
        if b > c:
            b, c = c, b
            if a > b:
                a, b = b, a
        print (a, "<", b, "<", c)
        

        这样做的好处是有时只使用两个 IF 语句而不是三个,修复了交换过程中的故障,并且具有简化且更易读的代码。

        【讨论】:

        • 用你的第一个代码,输入这个:Enter a: 1.1e308 Enter b: 1e308 Enter c: 0,我得到nan &lt; nan &lt; inf。不要用这么坏的把戏!
        • 我试图保留 op 的概念,并专注于展示将最后一个 IF 移到第二个中可能会提高性能 - 我同意用 op 的方法交换数字是幼稚的
        • 你可以编辑你的答案,包括一个大的“不要那样做”,并举例说明它是如何失败的” - 随意使用这个 - 以及你的第二个版本如何更好,会让你的答案更有价值。
        【解决方案5】:

        #简单程序以升序对列表进行排序

        name = [1, 2, 0, 1, 5, 3, 0, 8, 2, 9]
        len1=len(name)
        for i in range(len1): #iteration from 1st value
           for j in range(i+1,len1): #iteration from i+1 
               if  name[i] < name[j]: #this is ascending order (*the < changed to > then ascending order)
                   name[i],name[j]=name[j],name[i] #swapping logic in python
        print (name)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多