首页 > 编程问答 >为什么使用函数交换和使用赋值交换会产生不同的结果?

为什么使用函数交换和使用赋值交换会产生不同的结果?

时间:2024-07-26 04:55:40浏览次数:14  
标签:python sorting data-structures quicksort swap

这是快速排序的代码,其中我使用赋值来交换值。

def partion(arr,low,high):
  partion_index=low
  pivot=arr[partion_index]

  while (low < high):
    while low < len(arr) and (arr[low]<=pivot):
      low+=1
    while (arr[high]>=pivot):
      high-=1
    if (low < high):
      arr[low],arr[high]=arr[high],arr[low]

  pivot,arr[high]=arr[high],pivot
  return high   
def quickSort(arr,low,high):
  if(low <high):
    p=partion(arr,low,high)
    quickSort(arr,low,p-1)
    quickSort(arr,p+1,high)

这会产生错误的结果。当我尝试使用交换功能来完成相同的工作时,它起作用了。

def swap(a, b, arr):
    if a!=b:
        tmp = arr[a]
        arr[a] = arr[b]
        arr[b] = tmp

def partion(arr,low,high):
  partion_index=low
  pivot=arr[partion_index]

  while (low < high):
    while low < len(arr) and (arr[low]<=pivot):
      low+=1
    while (arr[high]>=pivot):
      high-=1
    if (low < high):
      swap(low, high, arr)
      
  swap(partion_index, high, arr)
  return high

为什么会这样?


你遇到的问题与使用赋值交换与使用函数交换无关。这两种方法在 Python 中都可以用来交换列表中的元素。真正的问题在于分区逻辑中的 枢轴元素的最终位置 的处理方式。

让我们来分析一下你的代码出了什么问题,以及如何解决它。

问题所在

你的原始 partition 函数中的错误在于这一行:

pivot,arr[high]=arr[high],pivot

在分割操作结束时, high 指向了枢轴元素应该在的正确位置。然而,你执行的赋值实际上导致了两个问题:

  1. 枢轴值的丢失: 你用 arr[high] 的值覆盖了 pivot 的原始值。虽然你打算将 arr[high] 放置在枢轴位置,但这个操作丢失了原始的枢轴值。
  2. 不一致的交换: 在这种情况下,你只交换了 pivot arr[high] ,这与你之前在循环中使用 arr[low], arr[high] = arr[high], arr[low] 进行的交换不一致。这种不一致可能会导致错误的排序结果。

解决方案

要解决此问题,应该 直接将枢轴元素放置在 high 指向的正确位置 。由于 partition_index (或 low ,因为它引用相同的位置)保存着枢轴元素的原始索引,因此可以直接进行交换:

def partion(arr, low, high):
  partion_index = low
  pivot = arr[partion_index]

  while low < high:
    while low < len(arr) and arr[low] <= pivot:
      low += 1
    while arr[high] >= pivot:
      high -= 1
    if low < high:
      arr[low], arr[high] = arr[high], arr[low]

  # 将枢轴放置在正确的位置
  arr[partion_index], arr[high] = arr[high], arr[partion_index] 
  return high

通过这种修改,无需使用单独的 swap 函数,并且可以确保将枢轴元素正确放置在已排序数组中的最终位置。

使用或不使用 swap 函数

只要在 partition 函数中更正了枢轴放置逻辑,使用赋值交换或使用单独的 swap 函数都不会影响快速排序的正确性。两种方法都实现了相同的目标,即交换列表中的元素。选择哪种方法主要取决于个人的编码风格和偏好。

标签:python,sorting,data-structures,quicksort,swap
From: 78795311

相关文章

  • 如何在 Python 中对多行使用单个 INSERT INTO 语句?
    我目前正在开发一个DiscordPython机器人,我在其中循环遍历ForumTags列表,并为每个对象生成INSERTINTOSQL语句以将数据插入MySQL数据库。但是,我想要通过将所有这些单独的INSERTINTO语句组合到单个查询中来优化我的代码,如下所示:INSERTINTO......
  • 双 for 循环的 Pythonic 方式
    我有以下代码:importnumpyasnpepsilon=np.array([[0.,0.00172667,0.00071437,0.00091779,0.00154501],[0.00128983,0.,0.00028139,0.00215905,0.00094862],[0.00035811,0.00018714,0.,0.00029365,0.00036993......
  • 在 matplotlib 中绘制一个字符串函数 // 将 str 解释为 python 代码?
    我正在创建一个RPN计算器,尝试绘制用户给出的函数。例如,如果用户输入"xsin3*plot"我希望它绘制sin(x)*3其代码如下。注意:问题在ifprompt=="plot"userInputX=""#userInputXisalwaysreplacedbefore......
  • Python (Pebble) - 超时功能。当 TimeoutError 发生时,获取从 iterable 传递给函数的值
    我正在尝试在Pebble中设置工作超时(基本上有效)frompebbleimportProcessPoolfrommultiprocessingimportProcess,Pool,cpu_countimporttimedeftest_fn(randomNumberFromList):#print(f'Beginngingforthisnumber:{randomNumberFromList}')ifr......
  • 为什么在 Python 上使用正则表达式组功能会给出不同的输出
    importrestring1="aaabaa"zusuchen="aa"#1m_start=re.finditer(fr'(?=({zusuchen}))',string1)results=[(match.start(1),match.end(1)-1)formatchinm_start]forzinresults:print(z)print("Now#2:"......
  • 如何在python3中找到文件的长度?
    我的第一个.py:defcreate_file(file_name):list=["ab","cd","ef"]foriinlist:withopen(file_name,"a+")asinput_file:print("{}".format(i),file=input_file)我的第二个.py:fromfirstimport......
  • 哪种 python 日志记录风格是推荐的或标准的?
    我是Python新手。介于以下2个选项之间。对于python来说,推荐哪种风格或者更好?logging.info(f"Won'tsavemodelasscoreisbelow0,score:{score}")logging.info("Won'tsavemodelasscoreisbelow0,score%s",score)我个人更喜欢第二种方法。在Python......
  • python 协程 自定义互斥锁
    最近在用python的一款异步web框架sanic搭建web服务,遇到一个需要加特定锁的场景:同一用户并发处理订单时需要排队处理,但不同用户不需要排队。如果仅仅使用asyncwithasyncio.Lock()的话。会使所有请求都排队处理。1importasyncio2importdatetime34lock=asyncio.L......
  • Python 获取tiktok视频评论回复数据 api接口
    TIKTOKapi接口爬取tiktok视频评论回复数据详细采集页面如图https://www.tiktok.com/@dailymail/video/7329872821990182190?q=neural%20link&t=1706783508149请求APIhttp://api.xxxx.com/tt/video/info/comment/reply?video_id=7288909913185701125&comment_id=7294900......
  • Shopee虾皮api python获取虾皮购物平台的商品数据信息 数据采集
    虾皮购物(英语:Shopee)是一个电商平台,总公司设在新加坡,归属于SeaGroup(之前称之为Garena),该企业于2009年由李小冬(ForrestLi)创办。虾皮购物于2015年初次在新加坡推出,现阶段已拓展到马来西亚、泰国、印度尼西亚、越南和菲律宾。虾皮购物为全球华人地区的客户提供线上购物和销售......