嗯,我知道这是一个奇怪的问题,但我发现了这个快速排序算法的java代码:
private static void quickSort (ArrayList <String> list, int first, int last){
int g = first;
int h = last;
int midIndex = (first + last) / 2;
String dividingValue = list.get(midIndex);
do{
while (list.get(g).compareTo(dividingValue) < 0) g++;
while (list.get(h).compareTo(dividingValue) > 0) h--;
if (g <= h)
{
swap(list,g,h);
g++;
h--;
}
}
while (g < h);
if (h > first) quickSort (list,first,h);
if (g < last) quickSort (list,g,last);
}
private static void swap (ArrayList <String> list, int first, int h)
{
String temp = list.get(first);
list.set(first, list.get(h));
list.set(h, temp);
}
我工作,但这对我来说没有意义。有人能以某种方式给我这个代码的解释吗? 或者如果可能的话,为快速排序提供更简单的代码?
答案 0 :(得分:2)
我将假设您知道quicksort如何工作,并且只是想知道这个特定的实现。我也假设代码是正确的。我们首先定义我们正在研究的范围并选择一个支点。
private static void quickSort (ArrayList <String> list, int first, int last) {
int g = first;
int h = last;
int midIndex = (first + last) / 2;
String dividingValue = list.get(midIndex);
然后我们从范围的两端开始并向内工作。我们希望枢轴左侧的所有内容都更小,右侧的所有内容都更大。因此,我们跳过已满足此要求的任何元素。
do {
while (list.get(g).compareTo(dividingValue) < 0) g++;
while (list.get(h).compareTo(dividingValue) > 0) h--;
当我们达到两个违反财产的要素时,我们交换它们,使它们在正确的一侧,然后向内移动。 if (g <= h)
检查是必要的,因为我们在交换后盲目地应用g++
和h--
(而不是检查while
循环中的值)。它似乎交换枢轴以处理没有相反的元素交换。这肯定需要进行测试以确保正确性。
if (g <= h)
{
swap(list, g, h);
g++;
h--;
}
我们继续这样做,直到我们到达枢轴(稍微隐含,因为可以交换枢轴)。
} while (g < h);
我们递归地将此属性应用于列表的子部分,以便整个列表进行排序。
if (h > first)
quickSort(list, first, h);
if (g < last)
quickSort(list, g, last);
}
private static void swap (ArrayList <String> list, int first, int h)
{
String temp = list.get(first);
list.set(first, list.get(h));
list.set(h, temp);
}