将c++第一个元素快速排序为枢轴
Quicksort c++ first element as pivot
我有这样的东西,我想把第一个元素作为pivot。为什么这个程序仍然不起作用?
void algSzyb1(int tab[],int l,int p)
{
int x,w,i,j;
i=l; //l is left and p is pivot, //i, j = counter
j=p;
x=tab[l];
do
{
while(tab[i]<x) i++;
while(tab[j]>x) j--;
if(i<=j)
{
w=tab[i];
tab[i]=tab[j];
tab[j]=w;
i++;
j--;
}
}
while(!(i<j));
if(l<j) algSzyb1(tab,l,j);
if(i<p) algSzyb1(tab,i,p);
}
查看代码,而不是真正检查它的功能,只查看单个行,这一行很突出:
while(!(i<j));
我看着那条线,心想:这附近有个虫子。我实际上还没有看过代码,所以我不知道错误是什么,但我看了这一行,它看起来是错误的。
我认为在递增I之前需要递减j。
while (tab[j]>x ) j--;
while (tab[i]<x && i < j) i++;
此外,我添加了一个额外的条件,以确保我不会扫过j。(未初始化的内存读取)。
pivot的名称有点错误,因为最终结果是一个排序的元素,但this和wikipedia页面:quicksort都将pivot移动到更高的分区中,并且不能保证项目位于正确的位置。
结束条件是当你扫过列表时
while( i < j ); /* not !(i<j) */
在搜索结束时,您需要测试一个较小的集合。您创建的代码出现堆栈溢出,因为它重复尝试相同的测试。
if (l<j) algSzyb1(tab, l, j);
if (j+1<p) algSzyb1(tab, j+1, p);
全代码
void algSzyb1(int tab[], int l, int p)
{
int x, w, i, j;
i = l;
j = p;
x = tab[l]; //wróć tu później :D
do
{
while (tab[j]>x ) j--;
while (tab[i]<x && i < j) i++;
if (i < j)
{
w = tab[i];
tab[i] = tab[j];
tab[j] = w;
i++;
j--;
}
} while ((i<j));
if (l<j) algSzyb1(tab, l, j);
if (j+1<p) algSzyb1(tab, j+1, p);
}
相关文章:
- 如何修复我的快速排序实现?
- C++运行时错误与快速排序算法抛出堆栈转储错误
- 在 MIPS 中快速排序
- 不正确的比较和交换计数器输出用于快速排序功能
- 使用 std::vector C++快速排序,EXC_BAD_ACCESS代码 2
- 快速排序 - 三个中位数枢轴选择 - 某些元素顺序不正确
- 用于快速排序的最大元素交换次数
- 当中间元素选择为枢轴时,快速排序C 不起作用
- (C++)添加随机性以对相等元素进行快速排序
- 如何在只更改一个元素的情况下在排序列表中进行快速排序
- 快速排序和合并排序坏内存分配(不对 32k 元素进行排序)
- 将c++第一个元素快速排序为枢轴
- 快速排序后打印出数组的元素
- 为什么快速排序在有许多重复元素的情况下效率低下
- 快速排序中作为枢轴的第一个元素
- 使用中间元素作为透视C++计算快速排序中的比较数
- 快速排序不能在10k个元素下工作
- 当选择最左侧或最右侧的元素作为枢轴时,快速排序显然采用 O(n^2)
- 为什么我的简单快速排序实现失败时,等效的元素在数组中
- 实现了3个元素分割的快速排序算法