快速排序相关

1.对八个元素的序列进行快速排序,在最好的情况下,元素间的比较次数为13

#include<stdio.h>
#define M 8
int cnt=0;
int quickp(int a[],int l,int r) {
    int i=l,j=r,k;
    int tmp=a[l],cnt2=0;
    while(i!=j) {//左右未遍历完成
        while(j>i && a[j]>tmp) {
            j--;
            cnt++;
            cnt2++;
        }
        a[i]=a[j];//a[j]:从右边数比基准小的——基准变为比基准小的数
        while(i<j && a[i]<tmp) {
            i++;
            cnt++;
            cnt2++;
        }
        a[j]=a[i];//a[i]:从左边数比基准大的——比基准小的数变成比基准大的数
    }
    printf("l=%d,i=%d,r=%d,cnt=%d,cnt2=%d\n",l,i,r,cnt,cnt2);
    a[i]=tmp;//找到基准的最后位置,赋值
    for(k=0;k<M;k++) printf("%d ",a[k]);printf("\n");
    return i;//返回基准的最后位置
}
void qp(int a[],int l,int r) {
    if(l<r) {
        int i=quickp(a,l,r);
        printf("%d %d / %d %d\n",l,i-1,i+1,r);
        qp(a,l,i-1);
        qp(a,i+1,r);
    }
}
int main() {
    int a[M],i,j,k;
    for(i=0;i<M;i++) scanf("%d",&a[i]);
    qp(a,0,M-1);
    for(i=0;i<M;i++) printf("%d ",a[i]);
    printf("\n%d",cnt);
    return 0;
}
View Code

 2.快速排序非递归(栈)

#include<stdio.h>
#define M 5
struct {
    int l,r;
}s[10];
int main()
{
    int a[M],i,j,l,r,k=0,tmp;
    for(i=0;i<M;i++) scanf("%d",&a[i]);
    s[0].l=0;s[0].r=M-1;
    while(k>-1) {
        l=s[k].l;r=s[k--].r;
        if(l<r) {
            i=l;j=r;
            tmp=a[l];
            while(i!=j) {
                while(j>i && a[j]>tmp) j--;
                a[i]=a[j];
                while(i<j && a[i]<tmp) i++;
                a[j]=a[i];
            }
            a[i]=tmp;
            s[++k].l=l;s[k].r=i-1;
            s[++k].l=i+1;s[k].r=r;
        }
    }
    for(i=0;i<M;i++) printf("%d ",a[i]);
    return 0;
}
View Code

 3.快速排序非递归(队列)

#include<stdio.h>
#define M 5
#define len 10
struct {
    int l,r;
}q[len];
int main()
{
    int a[M],i,j,l,r,f,t,tmp;
    for(i=0;i<M;i++) scanf("%d",&a[i]);
    q[0].l=0;q[0].r=M-1;
    f=-1;t=0;
    while(f!=t) {
        f=(f+1)%len;
        l=q[f].l;r=q[f].r;
        if(l<r) {
            i=l;j=r;
            tmp=a[l];
            while(i!=j) {
                while(j>i && a[j]>tmp) j--;
                a[i]=a[j];
                while(i<j && a[i]<tmp) i++;
                a[j]=a[i];
            }
            a[i]=tmp;
            t=(t+1)%len;
            q[t].l=l;q[t].r=i-1;
            t=(t+1)%len;
            q[t].l=i+1;q[t].r=r;
        }
    }
    for(i=0;i<M;i++) printf("%d ",a[i]);
    return 0;
}
View Code

 

posted @ 2023-10-15 21:17  夜雨声不烦  阅读(2)  评论(0编辑  收藏  举报