C语言第6章1 数组
【例】对10个数从小到大排序 int a[10]; int i,j,t; printf("input 10 numbers :\n"); for (i=0;i<10;i++) scanf("%d",&a[i]); printf("\n"); for(j=0;j<9;j++) //进行9趟排序 for(i=0;i<9-j;i++) //每趟比较9-j次 if (a[i]>a[i+1]) {t=a[i];a[i]=a[i+1];a[i+1]=t;} //交换两数 printf("the sorted numbers :\n"); for(i=0;i<10;i++) printf("%d ",a[i]); printf("\n"); 输入各整数 j =0;j<9 i =0;i<9-j a[i]>a[i+1] 真 假 t=a[i] a[i]=a[i+1] a[i+1]=t 输出排序后的数 运行结果: input 10 numbers: 13 20 64 78 21 8 14 30 45 23↙ the sorted numbers: 8 13 14 20 21 23 30 45 64 78 【例】用选择法对数组中的数进行排序 5 7 4 2 8 6 p p=0,a[p]=5 5 7 4 2 8 6 p a[p]与a[1]比,p记下最小元素位置 p=0,a[p]=5 5 7 4 2 8 6 p a[p]与a[2]比,p记下最小元素位置 p=2,a[p]=4 5 7 4 2 8 6 p a[p]与a[3]比,p记下最小元素位置 p=3,a[p]=2 5 7 4 2 8 6 p a[p]分别与a[4],a[5]比, p记下最小元素位置p=3,a[p]=2 j=0;p=j; //j每趟最小值的位置 for(i=j+1;ia[i]) { p=i; } p记下a[0]~a[5]间的最小数的位置。 若p!=j,则调换p位置元素与第j元素的值 5 7 4 2 8 6 p a[p]分别与a[4],a[5]比, p记下最小元素位置p=3,a[p]=2 t=a[j]; a[j]=a[p] ; a[p]=t; 以上是一趟选择排序过程,后面可按此思路,j从1循环至4,从a[j+1]~a[5]中找出最小元素与a[j]交换,那么经过5趟选择排序后,将得到从小到大的顺序数。 2 7 4 5 8 6 j 原始数据: 5 7 4 2 8 6 第1趟排序: 2 7 4 5 8 6 a[0] a[1] a[2] a[3] a[4] a[5] 第2趟排序: 2 4 7 5 8 6 第3趟排序: 2 4 5 7 8 6 第4趟排序: 2 4 5 6 8 7 第5趟排序: 2 4 5 6 7 8 选择法排序过程 // 选择法排序程序 int main() { int i,j,p,t, a[6]={5,7,4,2,8,6}; for(j=0;j<5;j++) { p=j; //标记当前最小元素下标 for(i=j+1;i<=5;i++) //经过5趟排序 { if(a[p]>a[i]) p=i; //比较,记录每趟选 // 择中最小元素位置 } if(p!=j) // 交换j和p位置上的数 { t=a[j];a[j]=a[p];a[p]=t; }