例6-1对200个学生成绩 从大到小排序 算法 输入200个成绩 排序 输入排序结果
6 例6-1 对200个学生成绩 从大到小排序 ▪ 算法 ▪ 输入200个成绩 ▪ 排序 ▪ 输入排序结果
冒泡法对N个数从大到小排序 for i=0; j<=N-2: j++) 通过依次比较叫口和a[工+1.不满足顺序交换 再 直for(=O:=(N-1)-(-1)i+) 通 if(a[<a[+1 =a[a[=a[i+1]:a[i+1]=t} ■■■■ 第J趟排序:比较a[和a[1],不满足顺序交换, 再比较a[1]和a[2],不满足顺序交换,依此类推, 直至N-j-2]和aN-j-1]比较,不满足顺序交 换,通过这一趟的两两比较找到第j*1个最小的 数放在aN--1]的位置 共N-1趟 7
7 冒泡法对N个数从大到小排序: ▪ 第0趟排序:比较a[0]和a[1],不满足顺序交换, 再比较a[1]和a[2],不满足顺序交换,依此类推, 直至a[N-2]和a[N-1]比较,不满足顺序交换, 通过这一趟的两两比较找到第1个最小的数放在 a[N-1]的位置 ▪ …… ▪ 第J趟排序:比较a[0]和a[1],不满足顺序交换, 再比较a[1]和a[2],不满足顺序交换,依此类推, 直至a[N-j-2]和a[N-j-1]比较,不满足顺序交 换,通过这一趟的两两比较找到第j+1个最小的 数放在a[N-j-1]的位置 ▪ 共N-1趟 for(j=0;j<=N-2;j++) { /*第j趟排序*/ } /*通过依次比较a[I]和a[I+1],不满足顺序交换*/ for(i=0;i<=(N-1)-(j-1);i++) if(a[i]<a[i+1]) {t=a[i];a[i]=a[i+1];a[i+1]=t;}
include <stdio. h> #deN200例6-1完整程序:冒泡法 〔 int a[N],ijt printf Input %d score: \nN) for(=0:i<=N-1;i*+ scant("%d",&a[i〕) for(=0j<=N-2j+)冒泡法排序 for(i=O; i<=N-j-2; i++) if(a[]<a[i+1)若从小到大排序,改成> t=a[ij:a[i]=a[i+1]a[i+1]=t:} printf(" \n The sorted score: \n) for(i=0:i<=N-1:i++) if(‰15=0) printf("n") printf( %4d",a[iD: }/书中P167的源代码改为for(=0<N-j-2:++)*
8 #include <stdio.h> #define N 200 void main() { int a[N],i,j,t; printf("Input %d score:\n",N); for(i=0;i<=N-1;i++) scanf("%d",&a[i]); for(j=0;j<=N-2;j++) /*冒泡法排序*/ for(i=0;i<=N-j-2;i++) if(a[i]<a[i+1]) /*若从小到大排序,改成>*/ { t=a[i]; a[i]=a[i+1]; a[i+1]=t; } printf(" \n The sorted score:\n"); for(i=0;i<=N-1;i++) { if(i%15==0) printf("\n"); printf("%4d ",a[i]); } } /*书中P167的源代码改为for(i=0;i<=N-j-2;i++) */ 例6-1完整程序:冒泡法
fori=0:j<=N-2:++) 〔从@[门至aN,比较找出其中最大数所在的下标maxj max_I=J for(=j+1;<=N-1:i++) if(a[i>a[max_ iD) [max j=i:] 广若maxl=j,说明q[max比j大,则交换 if(max_i==j) [t=a[max_i]: a[max_i]=a[i]: aLi]=: ■第趟排序:从α叮全@N-1,比较找出其中 最大数所在的下标k,若k=j,说明a[k]比aj 大,则交换a和a[k,通过这一趟的比较找到 第j+1个最大的数放在a[门的位置 共N-1趟
9 选择法对N个数从大到小排序 ▪ 第0趟排序:从a[0]至a[N-1] ,比较找出其中 最大数所在的下标k,若k!=0,说明a[k]比a[0] 大,则交换a[0]和a[k],通过这一趟的比较找 到第1个最大的数放在a[0]的位置 ▪ …… ▪ 第J趟排序:从a[j]至a[N-1] ,比较找出其中 最大数所在的下标k,若k!=j,说明a[k]比a[j] 大,则交换a[j]和a[k],通过这一趟的比较找到 第j+1个最大的数放在a[j]的位置 ▪ 共N-1趟 for(j=0;j<=N-2;j++) { /*第j趟排序,通过这一趟排序,找到第j+1大的数存于a[j]*/ } /*从a[j]至a[N] ,比较找出其中最大数所在的下标max_i */ /*若max_i!=j,说明a[max_i]比a[j]大,则交换*/ max_i=j; for(i=j+1;i<=N-1;i++) if(a[i]>a[max_i]) {max_i=i;} if(max_i!==j) {t=a[max_i]; a[max_i]=a[j]; a[j]=t; }