- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
对于quickSort
,我有以下4种分区方法的代码.现在,如果我运行代码,各种分区的性能如下
数字可能因不同的机器和不同的时间而异。我现在不能说出每个分区的错误,我有几个问题:
我注意到 partition0 和 partition1 之间的唯一区别是 while 循环的条件:一个有 <=,另一个有 <。但是当我将第一个 <= 更改为 < 时,性能并没有改变。 2. 什么是 do{ } while(some condition)。和通常使用的while循环一样吗?
我注意到 partition0
之间的唯一区别和 partition1
是while
循环条件:一个有<=
另一个有<
.但是当我改变第一个<=
至 <
,性能不变。
什么是 do{ } while(some condition)
.和通常使用的while循环一样吗?
import java.util.Arrays;
import java.util.Random;
public class QuickSortTester {
static private Random rand = new Random(0);
public static void main(String[] args) {
int arraySize = 1000;
Integer[] list;
long start, end;
list = generateSortedIntegerArray(arraySize);
// list = generateRandomIntegerArray(arraySize);
System.out.printf("\n%15d", arraySize);
start = System.nanoTime();
sort(list, 0);
end = System.nanoTime();
System.out.printf("\t%15d", (end - start) / 1000);
if (!isSorted(list))
System.out.printf("Not sorted - problems!");
System.out.println();
list = generateSortedIntegerArray(arraySize);
// list = generateRandomIntegerArray(arraySize);
System.out.printf("\n%15d", arraySize);
start = System.nanoTime();
sort(list, 1);
end = System.nanoTime();
System.out.printf("\t%15d", (end - start) / 1000);
if (!isSorted(list))
System.out.printf("Not sorted - problems!");
System.out.println();
list = generateSortedIntegerArray(arraySize);
// list = generateRandomIntegerArray(arraySize);
System.out.printf("\n%15d", arraySize);
start = System.nanoTime();
sort(list, 2);
end = System.nanoTime();
System.out.printf("\t%15d", (end - start) / 1000);
if (!isSorted(list))
System.out.printf("Not sorted - problems!");
System.out.println();
list = generateSortedIntegerArray(arraySize);
//list = generateRandomIntegerArray(arraySize);
System.out.printf("\n%15d", arraySize);
start = System.nanoTime();
sort(list, 3);
end = System.nanoTime();
System.out.printf("\t%15d", (end - start) / 1000);
if (!isSorted(list))
System.out.printf("Not sorted - problems!");
}
public static <E extends Comparable<E>> boolean isSorted(E[] list) {
for (int i = 1; i < list.length; i++) {
if (list[i - 1].compareTo(list[i]) > 0) {
return false;
}
}
return true;
}
public static Integer[] generateRandomIntegerArray(int size) {
Integer list[] = new Integer[size];
for (int i = 0; i < list.length; i++)
// list[i] = rand.nextInt(10); //range from zero to number - 1
list[i] = rand.nextInt(); // unlimited range
return list;
}
public static Integer[] generateSortedIntegerArray(int size) {
Integer list[] = generateRandomIntegerArray(size);
Arrays.sort(list);
return list;
}
public static <E extends Comparable<E>> void sort(E[] list, int version) {
quickSort(list, 0, list.length - 1, version);
}
private static <E extends Comparable<E>> void quickSort(E[] list, int first, int last, int version) {
if (last > first) {
int pivotIndex;
if (version == 0)
pivotIndex = partition0(list, first, last);
else if (version == 1)
pivotIndex = partition1(list, first, last);
else if (version == 2)
pivotIndex = partition2(list, first, last);
else
pivotIndex = partition3(list, first, last);
quickSort(list, first, pivotIndex - 1, version);
quickSort(list, pivotIndex + 1, last, version);
}
}
private static <E extends Comparable<E>> int partition0(E[] list, int first, int last) {
int pivotIndex = (first + last) / 2;
E pivot = list[pivotIndex]; // Choose the first element as the pivot
swap(list, last, pivotIndex);
pivotIndex = last;
last--;
while (last >= first) {
// Search forward from left
while (first <= last && list[first].compareTo(pivot) < 0) //problem
first++;
// Search backward from right
while (first <= last && list[last].compareTo(pivot) >= 0)
last--;
// Swap two elements in the list
if (last > first) {
swap(list, first, last);
first++;
last--;
}
}
swap(list, pivotIndex, first);
return first;
}
private static <E extends Comparable<E>> int partition1(E[] list, int first, int last) {
int pivotIndex = (first + last) / 2;
E pivot = list[pivotIndex]; // Choose the first element as the pivot
swap(list, last, pivotIndex);
pivotIndex = last;
last--;
while (last >= first) {
// Search forward from left
while (first <= last && list[first].compareTo(pivot) < 0)
first++;
// Search backward from right
while (first <= last && list[last].compareTo(pivot) >= 0)
last--;
// Swap two elements in the list
if (last > first) {
swap(list, first, last);
first++;
last--;
}
}
swap(list, pivotIndex, first);
return first;
}
private static <E extends Comparable<E>> int partition2(E[] list, int first, int last) {
int pivotIndex = (first + last) / 2;
E pivot = list[pivotIndex]; // Choose the first element as the pivot
swap(list, last, pivotIndex);
pivotIndex = last;
last--;
while (last > first) {
// Search forward from left
while (first <= last && list[first].compareTo(pivot) < 0)
first++;
// Search backward from right
while (first <= last && list[last].compareTo(pivot) > 0)
last--;
// Swap two elements in the list
if (last > first) {
swap(list, first, last);
first++;
last--;
}
}
swap(list, pivotIndex, first);
return first;
}
private static <E extends Comparable<E>> int partition3(E[] list, int first, int last) {
int pivotIndex = (first + last) / 2;
E pivot = list[pivotIndex]; // Choose the first element as the pivot
swap(list, last, pivotIndex);
pivotIndex = last;
last--;
do {
// Search forward from left
while (first < last && list[first].compareTo(pivot) <= 0)
first++;
// Search backward from right
while (first <= last && list[last].compareTo(pivot) > 0)
last--;
// Swap two elements in the list
if (last >= first) {
swap(list, first, last);
first++;
last--;
}
} while (last > first);
swap(list, pivotIndex, first);
return first;
}
private static <E> void swap(E[] list, int index1, int index2) {
E tmp = list[index1];
list[index1] = list[index2];
list[index2] = tmp;
}
}
最佳答案
我不是 100% 确定,但我相信这是因为 last 和 first 用于检查左右索引是否相交。如果是这样,则不会发生交换,并且如果 first 和 last 相等,则当它到达执行交换的 if 语句时不会发生。
do-while loop 它就像一个while循环,不同的是它总是执行1次,不管语句是真还是假。然后它会像普通 while 循环一样执行该 block ,具体取决于您为其设置的 boolean 条件。
有关 do-while 循环的更多信息:http://www.tutorialspoint.com/java/java_loop_control.htm
在你的代码中:
do {
// Search forward from left
while (first < last && list[first].compareTo(pivot) <= 0)
first++;
// Search backward from right
while (first <= last && list[last].compareTo(pivot) > 0)
last--;
// Swap two elements in the list
if (last >= first) {
swap(list, first, last);
first++;
last--;
}
} while (last > first);
它总是先执行do内部,然后if last > first,一直执行直到语句为false。
关于java - QuickSort 测试仪调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33289409/
我需要测试一个在内部测试服务器上运行的网络应用程序。应用程序不输出 JSON,因为我没有将接受 header 更改为 application/json。有没有可以在您的计算机上运行的 json 测试应
我正在尝试建立一个与 iphone/android/ipad 兼容的网站,但没有这些设备。我尝试使用 Responsinator , 但注意到它甚至没有接收到我的 iPhone 媒体查询,例如: /*
我有一个应用程序需要针对某些罕见情况进行测试,这些情况涉及网络在精确时间死机,这种情况在实际使用中偶尔会发生,但很难测试。作为一名开发人员,我通过设置断点禁用我的互联网来模拟这一点,然后继续进行测试并
我目前正在开发一个项目,我需要使用重复的数据访问模式来测试我的原型(prototype)。我遇到了 fio,它是一个适用于 Linux 的灵活 I/O 测试器 ( 1 )。 Fio 有很多选项,我希望
我们正在将我们的网站转换为移动 View (iPhone),但我们还没有 iPhone。我需要一个可以在 Linux 平台上工作的 iPhone 测试仪,因为我们正在研究 LAMP。 我在 Stack
我正在测试作业数量,并期望获得每个不同作业数量的总 I/O 吞吐量 作业数量应该与总 I/O 吞吐量呈正相关 我在SSD工作站进行的测试如下结果没有任何意义,因为 1 个作业的 I/O 吞吐量大于多个
我是一名优秀的程序员,十分优秀!