将数组的两个整数索引作为参数的交换方法

问题描述:

以下代码用于快速排序类。在底部,有一种称为交换的方法,它应该采用数组并交换数组中的两个数字。这在Java中可能吗?换句话说,是否有可能在这种情况下工作的swap(T [],int,int)格式的方法?我希望我的问题有道理。将数组的两个整数索引作为参数的交换方法

public class QuickSort { 

public static <T extends Comparable<T>> void sort(T[] table) { 
    quickSort(table, 0, table.length - 1); 
} 

private static <T extends Comparable<T>> void quickSort(T[] table, int first, int last) { 
    if (first < last) { 
     int pivIndex = partition(table, first, last); 
     quickSort(table, first, pivIndex - 1); 
     quickSort(table, pivIndex + 1, last); 
    } 
} 

private static <T extends Comparable<T>> int partition(T[] table, int first, int last) { 
    T pivot = table[first]; 
    int up = first; 
    int down = last; 
    do { 
     while ((up < last) && (pivot.compareTo(table[up]) >= 0)) { 
      up++; 
     } 
     while (pivot.compareTo(table[down]) < 0) { 
      down--; 
     } 
     if (up < down) { 
      swap(table, up, down); 
     } 
    } 

    while (up < down); 
    swap(table, first, down); 
    return down; 
} 
+1

是的,应该可以正常工作。你试过了吗? – markspace

+0

他的缩进是不好的。这是一个“尽管”循环。 – markspace

是的,你可以做到这一点,因为在Java中的数组是一个对象,所以当你通过它,你真的通过其地址在内存中。然后被调用的函数可以对其执行操作,并且这些更改将反映到任何地方。

你可能会想到你可以在C++中做的事情,你不能用java做的,那就是swap(int x, int y)。因为java中的原始数据值没有地址(无论如何都不是程序员可用的地址),所以没有办法传递他们的地址,以便可以在非本地进行修改。

这有道理吗?

+0

是的,这是有道理的。那么数组索引的交换方法是否会像交换主体一样使用临时变量?或者交换可以直接完成? – Teej

+0

你会想要使用一个临时的,可能不在同一个数组中(只是交换函数的本地)。或者,你可能会遇到棘手的按位XOR操作(你可以做''b = a^b; a = a^b; b = a^b;')。 –