【问题标题】:Algorithm does not sort array as expected算法未按预期对数组进行排序
【发布时间】:2023-03-15 14:21:01
【问题描述】:

我得到了以下带有 [3, 7, 5 ,2, 1, 4, 8] 输入的算法。据说它是 QuickSort 的一部分,它构造了一个分区位置。输出应该是 [3, 1, 2, 5, 7, 4, 8]

我使用了以下python代码:

def partition(x, s, d):
    v = x[s]
    i = s-1
    j = d+1
    while i < j:
        while True:
            i = i+1 
            if x[i] >=v:
                break
        while True:
            j = j-1 
            if x[j] <=v:
                break 
        if (i<j):
            x[i], x[j] = x[j], x[i]
            
    print (x)
    return j
    
    
x = [3, 7, 5, 2, 1, 4, 8]
partition(x, 1, 6)

我无法得到 [3, 1, 2, 5, 7, 4, 8] 据称这是正确的结果。 请帮忙,我尝试了 s 和 d 的不同值,这很可能代表左右。

【问题讨论】:

  • 你得到了什么?
  • [3, 4, 5, 2, 1, 7, 8]
  • 我同意刚刚删除的评论,这里的第二个参数应该为零,否则你不对第一个数字进行排序..
  • 我删除了我的评论,因为如果第二个参数是第 6 行的 0,UNTIL x[i] &gt;= v 的索引超出范围错误。 @Surt
  • @LaytonGB 我也是这么认为的,但是算法实际上在检查索引之前会递增。

标签: python algorithm quicksort data-partitioning


【解决方案1】:

这是快速排序的分区算法。

由于我们使用while 循环而不是do.. while(这是您的算法REPEAT... UNTIL 中提到的内容),我们不需要减少s 并增加d

def partition(x, s, d):
    v = x[s]
    i = s
    j = d
    
    while i < j:
        while x[i] <= v:
            i += 1
        
        while x[j] >= v:
            j -= 1

        if (i<j):
            x[i], x[j] = x[j], x[i]
            
    print(x)
    return j
    
    
x = [3, 7, 5, 2, 1, 4, 8]
partition(x, 0, 6)

Output:

[3, 1, 2, 5, 7, 4, 8]

【讨论】:

    【解决方案2】:

    当定义ij 时,它们等于开始索引减1,结束索引加1。如果使用这些索引,它们将超出范围,因此会出现错误。因此,当代码到达REPEAT ... UNTIL 部分时,负1 和正1 立即撤消。为避免此问题,我使用了以下代码:

    lis = [3,7,5,2,1,4,8]
    
    def partition(x,s,d):
        v = x[s]
        i = s
        j = d
        while i < j:
            while x[i] <= v:
                i += 1
            while x[j] >= v:
                j -= 1
            if i < j:
                x[i], x[j] = x[j], x[i]
        return j
        
    position = partition(lis, 0, 6)
    print(position)
    print(lis)
    

    输出:

    2
    [3, 1, 2, 5, 7, 4, 8]
    

    我相信该位置可用于对列表进行分区并对其进行进一步排序,但由于缺乏信息,我不确定如何最好地做到这一点。

    感谢另一个答案,我相信混淆是由REPEAT ... UNTIL 条件语句引起的。通过发表我的声明&lt;= 而不仅仅是&lt;,我获得了所需的输出。

    【讨论】:

    • 消除 -1 的愚蠢也有效。而且你不需要辅助,OPs 交换应该很好。
    【解决方案3】:
    def partition(x, s, d):
        v = x[s]
        i = s-1
        j = d+1
        while i < j:
            while True:
                i = i+1 
                if x[i] >v: #--->
                    break
            while True:
                j = j-1 
                if x[j] <v: #--->
                    break
            if (i<j):
                x[i], x[j] = x[j], x[i]
                
        print (x)
        return j
        
        
    x = [3, 7, 5, 2, 1, 4, 8]
    partition(x, 0, len(x)-1) #---->
    
    [3, 1, 2, 5, 7, 4, 8]
    

    【讨论】:

      猜你喜欢
      • 2020-10-26
      • 1970-01-01
      • 2015-11-06
      • 1970-01-01
      • 1970-01-01
      • 2019-07-02
      • 1970-01-01
      • 1970-01-01
      • 2021-02-23
      相关资源
      最近更新 更多