不是颜 2023-03-16 22:23 采纳率: 66.7%
浏览 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日

悬赏问题

  • ¥15 想问一下树莓派接上显示屏后出现如图所示画面,是什么问题导致的
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)
  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号