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);