不是颜 2023-03-16 22:23 采纳率: 80%
浏览 19
已结题

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


#include <iostream>
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(i<j)
    {     
        do(i++);while(p[i]<x); 
        do(j--);while(p[j]>x);    
        if(i<j) swap(p[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<n;i++)
scanf("%d",&p[i]);
    
    quick_sort(p,0,n-1);
    
    printf("\n快速排序后的数组为:");
    for(int i=0;i<n;i++)
    printf("%d ",p[i]);
    return 0;
} 

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

  • 写回答

3条回答 默认 最新

  • Tigerfafa 2023-03-16 22:53
    关注

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

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

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月24日
  • 已采纳回答 3月16日
  • 创建了问题 3月16日

悬赏问题

  • ¥30 酬劳2w元求合作写文章
  • ¥15 在现有系统基础上增加功能
  • ¥15 远程桌面文档内容复制粘贴,格式会变化
  • ¥15 关于#java#的问题:找一份能快速看完mooc视频的代码
  • ¥15 这种微信登录授权 谁可以做啊
  • ¥15 请问我该如何添加自己的数据去运行蚁群算法代码
  • ¥20 用HslCommunication 连接欧姆龙 plc有时会连接失败。报异常为“未知错误”
  • ¥15 网络设备配置与管理这个该怎么弄
  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图