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
如果运气好也是错,那我倒愿意错上加错!
❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀
如果人生会有很长,愿你的荣耀永不散场