我尝试用Quickort编写代码,中间元素为pivot。
我成功写了一篇。
但Pivot的财产是:
左侧的元素小于枢轴,右侧的元素更大。
我无法在以下代码中实现此目的。
private static void QuickSortAlgorithm(int[] a, int i, int n)
{
if(i<n)
{
int part = partition(a,i,n);
QuickSortAlgorithm(a, i, part-1);
QuickSortAlgorithm(a, part, n);
}
}
private static int partition(int[] a, int i, int n)
{
int pivot = (i+n)/2;
int left = i;
int right = n;
while(left<=right)
{
while(a[left]<a[pivot]){
left++;
}
while(a[right]>a[pivot])
{
right--;
}
if(left<=right)
{
swap(a,left,right);
left++;
right--;
}
}
return left;
}
主要方法:
int a[]={5,7,3,9,1};
int n = a.length;
QuickSortAlgorithm(a,0,n-1);
System.out.println(Arrays.toString(a));
我怀疑是:
我发送左边作为我的分区索引。
但是,当我递归调用QuickSortAlgorithm()
时我发送了i to part-1
和part to n
;
我应该发送什么作为分区索引以便
我可以这样调用:这样可以满足枢轴属性吗?
QuickSortAlgorithm(a, i, part-1);
QuickSortAlgorithm(a, part+1, n);
谢谢:)
答案 0 :(得分:0)
您必须在包括第一个堆栈调用中发送数据透视值,并向第二个堆栈调用中的较低索引发送数据透视表+1。 您还必须将left的值设置为i + 1,这样您的代码才能给出正确的输出
答案 1 :(得分:-3)
您可以选择数组中最左边的元素,也可以选择任意随机元素作为您的支点。
查看wikipedia page on quicksort,了解有关选择数据透视的更多详情