C:冒泡法和选择法

冒泡法

算法示例

用起泡法对10个整数按升序排序。

算法分析

如果有n个数,则要进行n-1趟比较。在第1趟比较中要进行n-1次相邻元素的两两比较,在第j趟比较中要进行n-j次两两比较。比较的顺序从前往后,经过一趟比较后,将最值沉底(换到最后一个元素位置),最大值沉底为升序,最小值沉底为降序。

算法源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
 int main()
 {
 int a[10],i,j,t;
 printf("Please input 10 numbers: ");
 /*输入源数据*/
 for(i=0;i<10;i++)
 scanf("%d",&a[i]);
 /*排序*/
 for(j=0;j<9;j++) /*外循环控制排序趟数,n个数排n-1趟*/
 for(i=0;i<9-j;i++) /*内循环每趟比较的次数,第j趟比较n-j次*/
 if(a[i]>a[i+1]) /*相邻元素比较,逆序则交换*/
 { t=a[i];
 a[i]=a[i+1];
 a[i+1]=t;
 }
 
 /*输出排序结果*/
 printf("The sorted numbers: ");
 for(i=0;i<10;i++)
 printf("%d ",a[i]);
 printf("\n");
 return 0;
 
 }

选择法

算法示例要求

用选择法对10个整数按降序排序。

算法分析

每趟选出一个最值和无序序列的第一个数交换,n个数共选n-1趟。第i趟假设i为最值下标,然后将最值和i+1至最后一个数比较,找出最值的下标,若最值下标不为初设值,则将最值元素和下标为i的元素交换。

算法源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
 int main()
 {
 int a[10],i,j,k,t,n=10;
 printf("Please input 10 numbers:");
 for(i=0;i<10;i++)
 scanf("%d",&a[i]);
 for(i=0;i<n-1;i++) /*外循环控制趟数,n个数选n-1趟*/
 {
 k=i; /*假设当前趟的第一个数为最值,记在k中 */
 for(j=i+1;j<n;j++) /*从下一个数到最后一个数之间找最值*/
 if(a[k]<a[j]) /*若其后有比最值更大的*/
 k=j; /*则将其下标记在k中*/
 if(k!=i) /*若k不为最初的i值,说明在其后找到比其更大的数*/
 { t=a[k]; a[k]=a[i]; a[i]=t; } /*则交换最值和当前序列的第一
 个数*/
 }
 printf("The sorted numbers: ");
 for(i=0;i<10;i++)
 printf("%d ",a[i]);
 printf("\n");
 }

区别:(个人见解)

  • 冒泡法要进行对n个数进行n-1趟,第j趟要进行n-j次比较,每次比较相邻的数不符合则要交换,每趟最多需要n-j次数的交换
  • 选择法也要进行n-1趟,每趟是选出最值,而选最值是把下标交换,直到选出最值的下标,把最值和第一位交换,每趟最多仅需1次数的交换
  • 简单地说,冒泡法每次都是数的交换(各个下标对应的数是变化的),而选择法是通过下标交换(这时候各个下标对应的数是不变的)选出最值的下标,最后再进行数的交换
-------------本文结束 感谢您的阅读-------------