数组排序:冒泡法和选择法
1.冒泡法
假设有10个数
第1趟比较时,将10个数中最大的数沉到最底下,位于在a[10]的位置;
第2趟比较时,将剩下9个数中最大的数沉到最底下,位于在a[9]的位置;
……
依次类推,要往下沉9次,即进行9趟比较,才能将顺序排好。
趟数 i=n-1;
第1趟比较,需要进行9次两两比较,j=9;
第2趟比较,已有1个数位置固定,需要进行8次两两比较,j=8;
……
依次类推,需要第 i 趟比较,两两比较的次数为 j=9-i=n-1-i;
1 #include<stdio.h> 2 3 void main() 4 { 5 setvbuf(stdout,NULL,_IONBF,0); 6 int a[10]; 7 int i,j; 8 int t; 9 10 printf("input 10 numbers:\n"); 11 for(i=0;i<10;i++) 12 scanf("%d",&a[i]); 13 printf("\n"); 14 15 for(i=0;i<9;i++) //进行n-1趟比较 16 for(j=0;j<9-i;j++) //每趟比较中,有n-1-i次比较 17 { 18 if(a[j]>a[j+1]) //比较相邻两个数 19 { 20 t = a[j]; 21 a[j] = a[j+1]; 22 a[j+1] = t; 23 } 24 } 25 printf("The sorted numbers:\n"); 26 for(i=0;i<10;i++) 27 printf("%d ",a[i]); 28 printf("\n"); 29 }
2.选择法
假设有10个数
先将10个数中最小的数与a[0]对换;
再将a[1]到a[9]中最小的数与a[1]对换;
……
每比较一轮,找出一个未经排序的数中最小的一个。共比较9轮。
1 #include<stdio.h> 2 3 void main() 4 { 5 setvbuf(stdout,NULL,_IONBF,0); 6 int a[10]; 7 int i,j; 8 int min; 9 int t; 10 11 printf("input 10 numbers:\n"); 12 for(i=0;i<10;i++) 13 scanf("%d",&a[i]); 14 printf("\n"); 15 16 for(i=0;i<9;i++) 17 { 18 //找出a[i]到a[n]中最小的那个数的编号min 19 min = i; 20 for(j=i+1;j<10;j++) 21 if(a[j]<a[min]) 22 min = j; 23 24 //将最小的数a[min]与a[i]交换位置 25 t = a[min]; 26 a[min] = a[i]; 27 a[i] = t; 28 } 29 printf("The sorted numbers:\n"); 30 for(i=0;i<10;i++) 31 printf("%d ",a[i]); 32 printf("\n"); 33 }