//sorts(排序conclusion) #include <stdio.h> #include <stdlib.h> #include <time.h> /*选择排序 (优化:每次与pos位置上的数比较,pos记录最大数的位置,最后交换位置) int main() { int a[100],n,i,j,x; scanf("%d",&n); for (i=0;i<n;i++) scanf("%d",&a[i]); for (i=0;i<n-1;i++) { for (j=i;j<n;j++) { if (a[i]<a[j]) { x=a[i]; a[i]=a[j]; a[j]=x; } } } for (i=0;i<n;i++) printf("%4d",a[i]); printf(" "); return 0; }*/ /*冒泡排序 (优化:用flag标记每轮变化,如果无变化则说明已经按顺序排列,无需继续进行) int main() { int a[100],n,i,j,x; scanf("%d",&n); for (i=0;i<n;i++) scanf("%d",&a[i]); for (i=0;i<n-1;i++) { for (j=0;j<n-i;j++) { if (a[j]<a[j+1]) { x=a[j]; a[j]=a[j+1]; a[j+1]=x; } } } for (i=0;i<n;i++) printf("%4d",a[i]); printf(" "); return 0; }*/ //*希尔排序(冒泡排序升级版) int main() { int a[100]={0}; int n,i,step,flag,x,t; scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d",&a[i]); step=n/2; flag=0; t=1; while (step>0) { if(!flag) { flag=1; for(i=t;i<=n-step;i+=step) { if(a[i]>a[i+step]) { x=a[i]; a[i]=a[i+step]; a[i+step]=x; flag=0; } } } else { flag=0; t++; if (t==step+1) { t=1; step=step/2; } } } for(i=1;i<=n;i++) printf("%4d",a[i]); printf(" "); } /*插入排序 int main() { int a[100]={0}; int n,i,t,temp; scanf("%d",&n); for (i=1;i<=n;i++) scanf("%d",&a[i]); for (i=2;i<n;i++) { t=i-1; temp=a[i]; a[0]=temp; while (temp<a[t]) { a[t+1]=a[t]; t--; } a[t+1]=temp; } for (i=1;i<=n;i++) printf("%4d",a[i]); printf(" "); return 0; } */ /*快排 int n,a[100]; void sort(int left,int right) { int i,j,temp,x,t; if (left>right) return; i=left; j=right; srand(time(0)); t=left+rand()%(right-left+1); temp=a[t]; a[t]=a[left]; while(i<j) { while(a[j]>=temp&&i<j) j--; while(a[i]<=temp&&i<j) i++; if (i<j) { x=a[i]; a[i]=a[j]; a[j]=x; } } a[left]=a[i]; a[i]=temp; sort(left,i-1); sort(i+1,right); } int main() { int i; scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&a[i]); sort(0,n-1); for (i=0;i<n;i++) printf("%4d",a[i]); printf(" "); return 0; }*/