快速排序相关

发布时间 2023-10-15 21:24:55作者: 夜雨声不烦

对八个元素的序列进行快速排序,在最好的情况下,元素间的比较次数为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