快排小细节求助
查看原帖
快排小细节求助
693707
little_bo楼主2022/8/31 10:18

求问两个代码只有二分的时候有区别,但是后一个能AC前一个会有3个点都WA。实在不知道两个有啥区别

#include<iostream>
using namespace std;
int a[100001];
void sort(int l,int r){
    int i=l,j=r;
    int mid=(l+r)/2;//只有这里不一样,先把中间位置下标拿出来的这种写法就过不了
    while(i<=j){
        while(a[i]<a[mid])i++;//这里
        while(a[j]>a[mid])j--;//这里
        if(i<=j){
            swap(a[i],a[j]);
            i++;
            j--;
        }
    }
    if(l<j)sort(l,j);
    if(i<r)sort(i,r);
}
int main(){
    int n;
    cin>>n;
    for(int i=0;i<n;i++)cin>>a[i];
    sort(0,n-1);
    for(int i=0;i<n;i++)cout<<a[i]<<' ';
    return 0;
}

#include<iostream>
using namespace std;
int a[100001];
void sort(int l,int r){
    int i=l,j=r;
    int mid=a[(l+r)/2];//这个直接把中间值取出来就能过
    while(i<=j){
        while(a[i]<mid)i++;
        while(a[j]>mid)j--;
        if(i<=j){
            swap(a[i],a[j]);
            i++;
            j--;
        }
    }
    if(l<j)sort(l,j);
    if(i<r)sort(i,r);
}
int main(){
    int n;
    cin>>n;
    for(int i=0;i<n;i++)cin>>a[i];
    sort(0,n-1);
    for(int i=0;i<n;i++)cout<<a[i]<<' ';
    return 0;
}

2022/8/31 10:18
加载中...