快速排序中作为枢轴的第一个元素
First Element as pivot in Quick sort
为什么这段代码给我错了?在Quick sort中,我选择了第一个元素作为pivot:
我已经在纸上查到了,没有什么问题。
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);
您的函数显然应该对数组中的[l, h]
范围进行排序,但由于某种原因,您将元素编号i
与元素编号j
交换。后者(j
)在[l, h]
范围之外(它最初总是0,然后变成1、2、3,依此类推)。你想干什么?为什么要将元素交换到排序范围之外的某个完全无关的远程位置?
换句话说,在我看来,这根本不像是一种QuickSort风格的排序算法。您对j
的无法解释的操作是您的实现无法真正排序任何内容的原因之一。
您的算法错误。获取枢轴值int pivot = S[pivot_index];
。
然后确定要交换的两个元素。因此,从左侧确定第一个元素,该元素大于或等于枢轴值。由此得到CCD_ 8。然后确定右侧的第一个元素,该元素小于或等于枢轴值。由此得到CCD_ 9。只要i
小于j
,则交换S[i]
和S[j]
并重复该过程。
只有在没有更多的交换之后,看看是否可以递归地调用QuickSort。此处,必须对左侧部分和右侧部分进行两次单独的if
检查。
另外,请注意,最好将中间的元素作为枢轴元素。如果元素应该预先排序或按降序排序,则QuickSort将执行得更好。
int pivot = S[(l+h)/2];
相关文章:
- 如何实现 Front() 方法以返回模板化双向链表C++的第一个元素?
- 对的排序向量 (std::vector<pair<int, int>>) 按对的第一个元素搜索并更新第二个元素值
- C++ queue.front();为什么不从第一个元素开始呢?
- 指向数组基址的指针而不是指向第一个元素的指针有什么优点?
- 静态堆栈函数不会 1) 输入第一个元素 2)添加新元素时识别旧元素
- 从队列中删除第一个元素C++
- 如果第一个元素包含任何零,则我的程序以不希望的方式运行
- 为什么数组不打印第一个元素?
- 在数组中显示第一个元素用户输入
- 消除集合的第一个元素
- 为什么指向矢量第一个元素的指针会丢失?
- 如何打印出常量字符串的第一个元素?
- 读取数组的第一个元素还是第 4000 个元素更快?
- 如何在数组的一部分中查找特定值的第一个元素
- 对数组进行排序的算法,先是第一个元素,然后是前 2 个元素,然后是前 3 个元素,依此类推
- 访问指向对象指针向量的指针的第一个元素?
- 引用保留向量中的第一个元素
- 指向数组的指针是否应该等于指向其第一个元素的指针?
- 尝试将参数包的第一个元素作为函数调用,并将包的其余部分作为参数传递给它
- 代码是否有效.如果我想显示第一个元素?如果不是,那么 s.begin() 会返回什么?