Java 随机和中值快速排序
我正在使用快速排序进行一项作业,以显示当使用不同的方法获取轴状随机数或三个中位数时,算法的速度有多快。到目前为止,当使用随机或中位数时,我得到了不同的输出,但没有一个被排序,我无法找出我的错误是什么。我在互联网上走遍了每一个角落。有人能看看它,告诉我我做错了什么吗 以下是快速排序代码:Java 随机和中值快速排序,java,random,pivot,quicksort,Java,Random,Pivot,Quicksort,我正在使用快速排序进行一项作业,以显示当使用不同的方法获取轴状随机数或三个中位数时,算法的速度有多快。到目前为止,当使用随机或中位数时,我得到了不同的输出,但没有一个被排序,我无法找出我的错误是什么。我在互联网上走遍了每一个角落。有人能看看它,告诉我我做错了什么吗 以下是快速排序代码: import java.util.*; public class QuickSort { public static void main(String[] args) { int[] arr =
import java.util.*;
public class QuickSort {
public static void main(String[] args) {
int[] arr = {5, -32, 12, 43, 88, 19, 113, 62, -11, 2};
System.out.println(Arrays.toString(arr));
quickSort(arr);
System.out.println(Arrays.toString(arr));
}
public static void quickSort(int[] arr) {
quickSort1(arr, 0, arr.length -1);
}
private static void quickSort1(int[] list, int first, int last) {
if (first < last) {
int pivotLocation = partition(list, first, last);
quickSort1(list, first, pivotLocation - 1);
quickSort1(list, pivotLocation + 1, last);
}
}
private static int partition(int[] list, int first, int last) {
int pivot;
int smallIndex;
Random rand = new Random();
int num = rand.nextInt(list.length);
swap(list, first, (first + last) / 2);
pivot = list[first];
//pivot = medianOfThree(list, first, last);
//pivot = list[num];
smallIndex = first;
for (int index = first + 1; index <= last; index++) {
if (list[index] < pivot) {
smallIndex++;
swap(list, smallIndex, index); // Should we limit to if(smallIndex != index)
}
}
swap(list, first, smallIndex);
return smallIndex;
}
private static void swap(int[] list, int first, int second) {
int temp;
temp = list[first];
list[first] = list[second];
list[second] = temp;
}
private static int medianOfThree(int[] arr, int first, int last) {
int f = arr[first], l = arr[last], m = arr[(last + first)/2];
if(l <= f && l >= m || l >= f && l <= m)
return l;
else if (m <= f && m >= l || m >= f && m <= l)
return m;
return f;
}
}
编辑:
这是我用来测试排序效率和快速排序的测试代码,当循环仍不能正常工作时,我是否做错了什么
测试代码:
import java.util.*;
public class Test {
public static final int ARRAYSIZE = 50000; // Test array element count
public static final int ELEMENTSIZE = 10000; // Test array element size
public static final int LOOPS = 1000;
public static void main(String[] args) {
long t1=0,t2=0,t3=0;
long c1=0,c2=0; // Counters
for(int test = 1; test <= LOOPS; test++) {
System.out.print(test + "..");
Random rand = new Random();
int[] arr1 = new int[ARRAYSIZE];
for(int i = 0; i < ARRAYSIZE; i++) // Generate a random array with ARRAYSIZE elements
arr1[i] = rand.nextInt(ELEMENTSIZE);
int[] arr2 = Arrays.copyOf(arr1, arr1.length); // Use an exact array copy for each sorting test
int[] arr3 = Arrays.copyOf(arr1, arr1.length);
t1 = System.currentTimeMillis();
QuickSort.quickSort(arr1); //Run & Time Quick Sort
t2 = System.currentTimeMillis();
Arrays.sort(arr3); //Run & Time Arrays.sort
t3 = System.currentTimeMillis();
c1 += t2-t1;
c2+=t3-t2;
}
System.out.println();
System.out.println("Quick Sort took: " + c1/LOOPS + " milliseconds");
System.out.println("Arrays.sort took: " + c2/LOOPS + " milliseconds");
}
/* ADD YOUR CODE HERE */
}
import java.util.*;
公开课考试{
public static final int ARRAYSIZE=50000;//测试数组元素计数
公共静态final int-ELEMENTSIZE=10000;//测试数组元素大小
公共静态最终整数循环=1000;
公共静态void main(字符串[]args){
长t1=0,t2=0,t3=0;
长c1=0,c2=0;//计数器
对于(int test=1;test我发现了至少两个错误,可能还有其他错误。对于随机元素的选择,您应该使用如下内容:
int num = first + rand.nextInt(last - first + 1);
对于三个中间值,中间元素为:
int m = arr[(last + first)/2];
我建议您使用调试器运行程序,并在每一步完成后说服自己正确的操作。我发现代码存在问题,每当它比较完全相同的值时,它会不断切换并再次比较它们……因此,我设置了一个条件,每当发生这种情况时,就中断循环。
我用过:
if(leftPointer >=rightPointer || list[leftPointer]== list[rightPointer])
break;
else
swap(list, leftPointer, rightPointer);
而不是:
if(leftPointer >=rightPointer)
break;
else
swap(list, leftPointer, rightPointer);
这一类很好用
-谢谢谢谢,我换了
if(leftPointer >=rightPointer)
break;
else
swap(list, leftPointer, rightPointer);