快速排序相关
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; }
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; }
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; }