一个完美的冒泡排序,让你成为编码高手(编程思想的精髓)

为啥考官喜欢拿一个排序来考面试者,因为一个好的排序完全可以体现一个程序员的编程素养

看一个程序员的编程素养,一段代码就够了

场景设置

假如你想入职一家你非常心仪的单位,现实很残酷,你想去人家也想去,竞争很激烈,面试官只能择优录取。然而你的面试官是你姐的男朋友,摆在你面前的是:一个老掉牙的冒泡排序(面试官亲自出的题)要求:电脑实操,现场编码,具体如下:

给你一个列表items用python实现一个冒泡排序,写出代码

你心想冒泡排序不就是前后两两比较,前面比后面大就交换位置么?so easy! 😂

你废话不多说三下五除二上代码:👌

def bubble_sort(items: list)->list:
   for i in range(1, len(items)):
       # 每次遍历可以确定一个元素的位置
       for j in range(0, len(items)-i):
           if items[j] > items[j+1]:
               items[j], items[j+1] = items[j+1], items[j]

# 测试
if __name__ == '__main__':
   nums = [34,45,24,47,23,46,25,12]
   bubble_sort(nums)
   print(nums)

面试官看了你的代码小声对你说,你这个代码毫无竞争力你第一个就会被淘汰,要改改!!

他小声对你说如果list本来就是一个有序列表你这样不是白费半天劲白跑代码?你恍然大悟,于是修改代码

def bubble_sort(items: list)->list:
   for i in range(1, len(items)):
       swapped = False  #假设默认不需要交换(有序)
       # 每次遍历可以确定一个元素的位置
       for j in range(0, len(items)-i):
           if items[j] > items[j+1]:
               items[j], items[j+1] = items[j+1], items[j]
               swapped = True #首次循环发现元素有换位置就置为True
       if not swapped: 
           break

# 测试
if __name__ == '__main__':
   nums = [34,45,24,47,23,46,25,12]
   bubble_sort(nums)
   print(nums)

你姐夫看了你的代码,感觉还可以,但是其他人也都想到了这一步,还是没办法保送你!

于是他又对你小声说,你有两个地方要改改,1. 可以做成正向反向都可以排序 2. 如果别人调了你函数你把人家传给你的参数改了,人家的list如果在其他地方用到怎么办? 岂不是数据乱了?于是你又改…

def bubble_sort(items: list, ascending=True)->list:
   items = items[:] # 利用列表切片重新构造一个新列表,保持原列表不变
   for i in range(1, len(items)):
       swapped = False  #假设默认不需要交换(有序)
       # 每次遍历可以确定一个元素的位置
       for j in range(0, len(items)-i):
           if items[j] > items[j+1]:
               items[j], items[j+1] = items[j+1], items[j]
               swapped = True #首次循环发现元素有换位置就置为True
       if not swapped:
           break
   if not ascending:  # 利用列表的切片功能倒序 list[start:stop:step]
       items = items[::-1]
   return items

# 测试
if __name__ == '__main__':
   nums = [34,45,24,47,23,46,25,12]
   new_nums = bubble_sort(nums)  #返回值
   print(new_nums)
   print(nums)  #原来列表

延伸:别人调了你的函数而不对调用者的入参有改动叫做函数的无副作用性(调用函数不影响调用者)业内很多程序员都想不到这一点。这是软件工程项目解耦的重大思想。

这个时候你姐夫看到你的代码,脸上不觉露出阴险的微笑,保送有进了一步。此时一大部分竞争者都被淘汰!但是姐夫深知目前仍然有4个人也做到了这一步,不得不憋出姐夫的大招杀手锏!他小声对你说:“现在还有人竞争呢!我给你说如果列表不是数字怎么办,赶紧使用高阶函数功能 "。此时你倒吸一口凉气,没想到竞争如此激烈,🤔幸亏这几天恶补了python编程课,于是你费劲脑汁使出吃奶的力气又对代码进行改造

def bubble_sort(items: list, ascending=True, gt=lambda x,y:x>y)->list:
   items = items[:] # 利用列表切片重新构造一个新列表,保持原列表不变
   for i in range(1, len(items)):
       swapped = False  #假设默认不需要交换(有序)
       # 每次遍历可以确定一个元素的位置
       for j in range(0, len(items)-i):
           if gt(items[j] , items[j+1]): #使用传入的函数计算大小
               items[j], items[j+1] = items[j+1], items[j]
               swapped = True #首次循环发现元素有换位置就置为True
       if not swapped:
           break
   if not ascending:  # 利用列表的切片功能倒序 list[start:stop:step]
       items = items[::-1]
   return items

# 测试
if __name__ == '__main__':
   nums = [34,45,24,47,23,46,25,12]
   nums = ['张三','李四','王五','赵六','钱七','孙er八']
   new_nums = bubble_sort(nums,True, lambda x,y: len(x)<len(y))  #返回值
   print(new_nums)
   print(nums)  #原来列表

至此姐夫看到这段代码满意的点了点头,心想,没想到还真让这小子做出来了,牛👍。姐夫拿到这份代码自豪的向领导推荐,这小子代码可以说的鹤立鸡群,无懈可击,是一位难得的人才啊,最终你顺利进入到公司

高阶函数的运用是代码功能大增,同时做到代码解耦,应该是程序员追求的编码方式

通过本故事,对你编码之路可有启发?,有的话加个好友,关注下。

chatgpt免费上

关注,回复 trychat
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kavaj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值