为什么这段代码错了?在快速排序中,我选择了第一个元素作为枢轴:
我在纸面上追溯到没有错。
private void QuickSort(ref int [] S ,int l,int h)
{
//partioning
int pivot_index = l;
int j = 0;
int temp = 0;
for(int i=l+1;i<=h;i++)
if (S[pivot_index] > S[i])
{
j++;
temp = S[i];
S[i] = S[j];
S[j] = temp;
}
pivot_index = j;
temp = S[l];
S[l] = S[j];
S[j] = temp;
//end partioning
if (l < h && pivot_index>l && pivot_index<h)
{
QuickSort(ref S, l, pivot_index - 1);
QuickSort(ref S, pivot_index + 1, h);
}
}
这是我的主要内容:
int[] List = get_input(textBox1.Text, ref n);
//
QuickSort(ref List, 0, n-1);
答案 0 :(得分:1)
您的函数显然应该对数组中的[l, h]
范围进行排序,但出于某种原因,您要使用元素编号i
交换元素编号j
。后者(j
)超出[l, h]
范围(它始终为0,然后变为1,2,3等等)。你想做什么呢?为什么要将元素交换到排序范围之外的某个完全不相关的远程位置?
换句话说,这对我来说甚至看起来都不像是QuickSort风格的排序算法。使用j
进行无法解释的操作是实现无法对任何内容进行排序的原因之一。
答案 1 :(得分:0)
你的算法错了。获取轴心值int pivot = S[pivot_index];
。
然后确定要交换的两个元素。因此,确定左边的第一个元素,它大于或等于透视值。这给出了i
。然后确定右边的第一个元素,它小于或等于透视值。这给出了j
。只要i
小于j
交换S[i]
和S[j]
并重复此过程。
只有在没有更多切换后,查看是否可以递归调用QuickSort。这里必须对左侧部分和右侧部分进行两次单独的if
检查。
另外,请注意,最好将中间的元素作为pivot元素。如果要对元素进行预先排序或按降序排序,QuickSort的性能会更好。
int pivot = S[(l+h)/2];