Cải tiến này dựa trên ý tưởng của Lâm Nhân lớp LT02b. He he nếu có vi phạm bản quyền thì cho mình sr nha. PS: với lại bài này vẫn còn nhiều chỗ chưa được tối ưu nên mong các bạn đóng góp thêm ý kiến để thuật toán hoàn thiện Mã: #include<stdio.h> #include<conio.h> void in(int a[40],int n) { printf("\n"); for(int i=1;i<=n;i++) printf("%3d",a[i]); } void main() { clrscr(); int a[40],n,i,j,k,m,temp,x,max,min,temp2; scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d",&a[i]); in(a,n); printf("\nSau khi sap xep:\n"); temp2=temp3=n; for(i=1;i<=n/2;i++) { max=min=a[i]; k=m=i; for(j=i+1;j<=temp2;j++) { if(max<a[j]) { max=a[j]; k=j; } if(a[j]<min) { min=a[j]; m=j; } } if(a[i]==max&&a[temp2]==min) { a[i]=min; a[temp2]=max; } else if(a[i]==max&&a[temp2]!=min) { a[i]=a[temp2]; a[temp2]=max; a[m]=a[i]; a[i]=min; } else { a[m]=a[i]; a[i]=min; a[k]=a[temp2]; a[temp2]=max; } temp2--; } if(a[i]>a[i+1]) { temp=a[i]; a[i]=a[i+1]; a[i+1]=temp; } in(a,n); getch(); }