Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在枢轴上对阵列进行分区_Java_Algorithm_Sorting_Partitioning_Quicksort - Fatal编程技术网

Java 在枢轴上对阵列进行分区

Java 在枢轴上对阵列进行分区,java,algorithm,sorting,partitioning,quicksort,Java,Algorithm,Sorting,Partitioning,Quicksort,我试图编写一个简单的算法来移动围绕枢轴的元素,使枢轴左侧的元素小于枢轴,枢轴右侧的元素大于枢轴(与快速排序中的步骤相同)。我已经编写了可以工作的代码,但是在那之后我将算法更改为下面的,它不工作了 该算法思想简单 有两个指针,一个在数组的开头,一个在数组的结尾。如果i所指的元素小于pivot,则继续跳过它,直到找到更大的元素;继续递减j,直到找到一个大于较小元素的元素。[这是一种常见的算法] 现在输入代码 private static void sortByPivot(int[] a) {

我试图编写一个简单的算法来移动围绕枢轴的元素,使枢轴左侧的元素小于枢轴,枢轴右侧的元素大于枢轴(与快速排序中的步骤相同)。我已经编写了可以工作的代码,但是在那之后我将算法更改为下面的,它不工作了

该算法思想简单

有两个指针,一个在数组的开头,一个在数组的结尾。如果i所指的元素小于pivot,则继续跳过它,直到找到更大的元素;继续递减j,直到找到一个大于较小元素的元素。[这是一种常见的算法]

现在输入代码

private  static void sortByPivot(int[] a)
{

    Random r = new Random();
    int index = r.nextInt(a.length);
    int pivot = a[index];

    System.out.println("pivot = " + pivot);

    int i =0 , j = a.length -1;

    while(true)
        {

            while(a[i] <= pivot) i++;

            while( j >0 && a[j] >= pivot) j--;

            if(i <= j)
            {
                break;
            }
            else{
                swap(a,i,j);
               }

        }

        swap(a,i,index); //swap the pivot and the i
}
当我使用以下数组运行它时

  int[] a = {46,3,8,4,2,6,244,76} 
当轴拾取为4时 输出是

         4 3 8 46 2 6 244 76 
对于位于边缘的其他一些枢轴,我得到一个空指针异常

执行中是否存在任何缺陷。我觉得这个逻辑是对的。我已经试了很长一段时间了,但是我无法修复它。

检查这个。它的工作原理完全相同。试着比较一下,看看你错在哪里


请注意,如果您只是尝试对所有内容进行排序,您应该交换
a[i]
a[j]
的值(我知道您说的是“分区”,但如果对整个内容进行排序会不会有问题?)

java.util.Arrays.sort(int[] a)
java.util.Arrays.sort(int[] a, int fromIndex, int toIndex)


如果您的需求是自己做(家庭作业!),那么尝试上面的调试方法;把你期望的写在纸上,然后一步一步地看到底发生了什么

逻辑不正确。您刚刚编写了代码。只要花一点时间,在任何输入上运行这个程序,你就会直接找到缺陷

更好的方法是采用上面描述的方法
这是用于快速排序的数组分区的就地版本。希望它能解决你的问题

您是否尝试过在调试器中单步执行代码,并将其功能与预期的功能进行比较?行为在什么时候发生了分歧?枢轴例程通常用作排序例程的一部分。所以用一个排序例程实现它有点违背了这一点。。。
java.util.Arrays.sort(int[] a)
java.util.Arrays.sort(int[] a, int fromIndex, int toIndex)