C++快速排序算法,请各位看看怎么解决疑问


#include 
using namespace std;

const int N=1e6+10;
int p[N];
int n=0;

void quick_sort(int p[],int l,int r)
{
    if(l>=r)
    return;
    int x=p[l],i=l-1,j=r+1;
    while(ido(i++);while(p[i]do(j--);while(p[j]>x);    
        if(i[i],p[j]); 
        }
        quick_sort(p,l,j);
        quick_sort(p,j+1,r);
}
    
    
int main()
{
    printf("请输入数组的大小:");
    scanf("%d",&n);
    printf("\n请输入数组中各个数字:");
    for(int i=0;i"%d",&p[i]);
    
    quick_sort(p,0,n-1);
    
    printf("\n快速排序后的数组为:");
    for(int i=0;i"%d ",p[i]);
    return 0;
} 

为啥两个do while 为什么不能>=和<=

在这段代码中,使用了两个do-while循环来寻找分界点。这种写法比较灵活,可以处理一些特殊的情况,例如数组中有重复元素时。具体来说,第一个循环会从左向右逐个扫描数组元素,直到找到第一个大于或等于分界值x的元素;而第二个循环则会从右向左逐个扫描数组元素,找到第一个小于或等于分界值x的元素。然后交换这两个元素的位置,并继续执行下一轮循环。

如果我们改用<=和>=来判断元素的大小关系,会出现以下问题:当数组中存在多个与分界值相等的元素时,就会出现死循环的情况。具体地说,如果一个元素恰好等于分界值,那么它将被分到左右两个部分中,但由于使用的是<=和>=,所以它又会被不断地交换位置,直到程序进入死循环。因此,在快速排序算法中,通常会采用严格的<和>操作符来避免这种情况的发生。

需要注意的是,在C++中,do-while循环与while循环的区别在于,do-while循环至少会执行一次循环体,即使条件不成立;而while循环可能一次都不执行。在这里,使用do-while循环的主要目的是保证每个指针至少会移动一次,确保程序能够正确地运行。

因为x y是用来作为排序的哨兵元素,所以他们不参与交换

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^