为什么我的 BubbleSort 算法在 Java 中有效但在 Python 中无效

Why is my BubbleSort algorithm working in Java but not in Python

为什么这段代码似乎有效:

package de.Algos;

import java.util.Arrays;

public class Sort {
    public static int[] swap(int[] A, int i, int j) {
        int temp = A[i];
        A[i] = A[j];
        A[j] = temp;
        return A;
    }

    public static int[] bubbleSort(int[] A){
        int n = A.length;
        for(int i=0;i<=n-2;i++){
            for(int j=0;j<=n-2-i;j++){
                if(A[j]>A[j+1]){
                    swap(A,j,j+1);
                }
            }
        }
        return A;
    }

    public static void main(String[] args){
        int[] A = {12,3,4,5,24,5,3,35352,24,13513513,33};
        System.out.println(Arrays.toString(A));
        A = bubbleSort(A);
        System.out.println(Arrays.toString(A));
    }
}

虽然我对 Python 的翻译没有:

# currently not working yet

def swap(A, a, b): 
    A[a], A[b] = A[b], A[b]
    return A

def bubbleSort(A, n):
    for i in range(0,n-1,1):
        for j in range(0,n-1-i,1):
            if A[j] > A[j+1]:
                A = swap(A,j,j+1)
                display(f'Swapped {A[j]} at {j} with {A[j+1]} at {j+1}')
    return A   
A = [0, 1, 4, 25, 5, 745, 253264, 3]
display(A)
A = bubbleSort(A, len(A))
display(A)

我犯了哪个愚蠢的错误?

实在找不到。 也许它在 Python 中的 for 函数中 via range 表现不同?是否有任何更优雅的解决方案可以使它看起来尽可能接近给定的伪代码?

BubbleSort(A, n)
for i←0 to n-2 {
 for j←0 to n-2-i {
 if (A[j] > A[j+1]) {
     swap(A, j, j+1)
 }
 }
}

谨致问候和感谢,

def swap(A, a, b): 
    A[a], A[b] = A[b], A[a]
    return A

你的交换功能不对。 首先,右侧获取值,然后将它们保存在左侧 - 不排序,A[a] = A[b] 然后 A[b] = A[b] 你认为已经是 A[a]。 ..如果我清楚...很难用语言来表达。

我可以看到您在 python 中的 swap 方法定义与 Java 中的方法定义不同。

在 Java 中,您确实交换了 A[j] 和 A[j+1]。在 Python 中,没有交换,因为 A[j] = A[j+1] 但 A[j+1] 保持不变。尝试:

def swap(A, a, b): 
    A[a], A[b] = A[b], A[a]
    return A

现在有效的 Python 解决方案是:

def swap(A, a, b):
    A[a], A[b] = A[b], <b>A[a]</b>
    return一个

def bubbleSort(A, n):
    对于范围 (0,n-1,1) 中的 i:
        对于范围 (0,n-1-i,1) 中的 j:
            如果 A[j] > A[j+1]:
                A = 交换(A,j,j+1)
                显示(f'交换 {A[j]} 在 {j} 与 {A[j+1]} 在 {j+1}')
    return一个