【发布时间】:2012-01-23 00:19:31
【问题描述】:
我正在尝试编写一个简单的算法来围绕枢轴移动元素,使得枢轴左侧的元素小于枢轴,而枢轴右侧的元素大于它(快速排序中的相同步骤)。我已经编写了有效的代码,但之后我将算法更改为以下,但它不起作用。
算法的思路很简单。
有两个指针,一个在数组的开头,一个在数组的末尾。如果 i 指向的元素小于枢轴,则继续跳过它,直到找到更大的元素;并继续递减 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
}
交换例程:
private static void swap(int[] a, int i , int j)
{
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
当我使用以下数组运行它时
int[] a = {46,3,8,4,2,6,244,76}
以及枢轴摘为4时 输出是
4 3 8 46 2 6 244 76
对于位于边缘的其他一些枢轴,我得到一个空指针异常。
实施中是否有任何缺陷。这个逻辑对我来说似乎是正确的。我已经尝试了很长时间,但我无法修复它。
【问题讨论】:
-
您是否尝试过在调试器中单步执行您的代码,并将它的功能与您的预期进行比较?行为在什么时候出现分歧?
标签: java algorithm sorting partitioning quicksort