向大佬请教quicksort函数while循环里if判断语句
查看原帖
向大佬请教quicksort函数while循环里if判断语句
384240
浅醉且听风吟楼主2021/2/26 17:33
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<stdio.h>
#include<malloc.h>
#include<ctime>
using namespace std;
long long a[1000001];
void quicksortshow(long long *a,long long n);
struct stu 
{
    long long number;
    long long l,r;
    struct stu *next;
};
int len=sizeof(struct stu);
void swapn(long long *a,long long *b)
{
    long long tmp;
    tmp=*a;*a=*b;*b=tmp;
}
void insertsort(long long *a,long long l,long long r)
{
    long long i=l,j=r,mid,tmp;
    mid=(i+j)/2;
    int flag=1;
    for(;i<=r-1&&flag;i++)
    {
        tmp=i;
        flag=0;
        for(j=i+1;j<=r;j++)
        {
            if(a[tmp]>a[j])
                {tmp=a[j];flag=1;}
        }
        if(flag)
            swapn(&a[i],&a[tmp]);
    }

}
void insertSort(long long *a, long long left, long long right)
{
    for (long long i = left + 1; i <= right; i++)
        for (long long j = i; j > 0 && a[j] < a[j-1]; j--)
            swapn(&a[j],&a[j-1]);
}
long long seakmain(long long *a,long l,long r)
{
    long long mid;
    /*将中间值放最后*/
    mid=(l+r)/2;
    //mid = l + ((r - l) >> 1);

    if(a[l]>a[mid])
        swapn(&a[l],&a[mid]);
    if(a[l]>a[r])
        swapn(&a[l],&a[r]); 
    if(a[mid]>a[r])
        swapn(&a[mid],&a[r]); 
    swapn(&a[mid],&a[r]);

    return a[r];
}
void quicksort(long long *a,long long l,long long r)
{
    long long stander,le,ri;
    if(r-l+1<10)
        {
        insertSort(a,l,r);
        return; 
        }
    else
    {
    if(l<r)
    {

    le=l;
    ri=r-1;

    stander=seakmain(a,l,r);//找基准 

    while(1)
    {

        while(le<ri&&a[le]<=stander)
            le++;
        while(le<ri&&a[ri]>=stander)
            ri--;
        if(le<ri)
            {swapn(&a[le],&a[ri]);}//求教:当后面加上j--后3、4能过(1、2不能)
                                    //不加则1、2能过,3、4不能过 
        else
            break;
    }
    //cout<<"paixu3\n"<<endl;
    swapn(&a[le],&a[r]);
    //quicksortshow(a,10);
    quicksort(a,l,le-1);
    quicksort(a,le+1,r);
    }
    }
}
void quicksortshow(long long *a,long long n)
{
    long long i=0;
    while(i<n-1)
    {
        printf("%lli ",a[i]);
        i++;
    }
    printf("%lli\n",a[i]);  
}
int main()
{   
    long long i=0,j,n,num,firststu=1;
    //srand((int)time(NULL));
    //long long b[10]={9,8,3,6,1,0,2,4,5,7};
    //long long c[10]={1,1,1,1,1,1,1,1,1,1};
    //int tt;
    cin>>n;
    for(i=0;i<n;i++)
    {
        //a[i]=m-i;
        cin>>a[i];
    } 
    //cout<<"原始数据\n";
    //quicksortshow(a,10);
    quicksort(a,0,n-1);
    quicksortshow(a,n);

    return 0;
} 

向大佬请教quicksort函数第94行while循环里if判断语句,在交换后加上j--只能过3、4,不加只能过1、2,请问问题出哪里

2021/2/26 17:33
加载中...