总结c语言基础算法——冒泡排序法和选择排序法

1.首先无论何种排序方法其最终目的是按要求将所给数据进行排序。而在C语言中可以有很多排序的方法,这里着重介绍的是常用的较为基础和重要的算法——冒泡排序法和选择排序法。

下面将举一个例子进行讲解:

要求:从键盘输出10个整数,要求对它们按照从小到大的顺序排列。

冒泡排序法:

#include<stdio.h>
int main()
{
	int a[10];
	int i,j,t;
	printf("输入10个整数:");
	for(i=0;i<10;i++)             //先对一维数组赋值
	  scanf("%d",&a[i]);
	for(j=0;j<9;j++)              //这一步是进行9次“循环”,实现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("排好顺序的数据为:\n");
    for(i=0;i<10;i++)
      printf("%d ",a[i]);
    return 0;
}

运行结果如下:

输入10个整数:
1 0 4 8 12 6 -45 -67 10 3
排好顺序的数据为:
-67 -45 0 1 3 4 6 8 10 12
--------------------------------
Process exited after 36.37 seconds with return value 0
请按任意键继续. . .

上述代码有几个地方要特别注意:

for(j=0;j<9;j++)              //这一步是进行9次“循环”,实现9趟“比较”
 for(i=0;i<9-j;i++)          //在每一趟中进行9-j次”比较“

       这一步,因为整体是长度为10的数据,因此  j<9,不能为10。因为10个数两两比较只需要9    趟,即n个数只需进行n-1趟即可。而后面   i<9-j  是保证在每一趟中未排序的数字进行两两比较。每一次的比较结果将较小的数字放在上面,就像冒泡的方式一样,最终实现排序,因此叫做”冒跑排序法“。

选择排序法:

#include<stdio.h>
int main()
{
	int a[10];
	int i,j,t,k;
	printf("输入10个整数:");           //对一维数组进行赋值
	for(i=0;i<10;i++)  
	  scanf("%d",&a[i]);
	for(i=0;i<9;i++)                   
	  {
	  	k=i;                           //k在这里只是用来记住数字在数组中的位置
	  	for(j=i+1;j<10;j++)            //目的是保证将第i个数与其后面的元素比较
	  	  if(a[j]<a[k])                //如果a[j]<a[k]
	  	    k=j;                       //则将最小元素的序号保存到k中
	  	if(k!=i)                       //如果k值有变化
	  	{t=a[k];                       //则将最小的元素与a[i]对换
	  	 a[k]=a[i];
	  	 a[i]=t;
		}                              //重新进入下一轮循环,直到外循环结束
	  }
    printf("排好顺序的数据为:\n");
    for(i=0;i<10;i++)
      printf("%d ",a[i]);
    return 0;
}

运行结果如下:

输入10个整数:
1 0 4 8 12 6 -45 -67 10 3
排好顺序的数据为:
-67 -45 0 1 3 4 6 8 10 12
--------------------------------
Process exited after 3.162 seconds with return value 0
请按任意键继续. . .


 需要注意的地方:

	for(i=0;i<9;i++)                   
	  {
	  	k=i;                           //k在这里只是用来记住数字在数组中的位置
	  	for(j=i+1;j<10;j++)            //目的是保证将第i个数与其后面的元素比较
	  	  if(a[j]<a[k])                //如果a[j]<a[k]
	  	    k=j;                       //则将最小元素的序号保存到k中
	  	if(k!=i)                       //如果k值有变化
	  	{t=a[k];                       //则将最小的元素与a[i]对换
	  	 a[k]=a[i];
	  	 a[i]=t;
		}                              //重新进入下一轮循环,直到外循环结束
	  }

       选择排序法的关键在于,它的排序机制是只记住每一个数字在原始数组中的序号,同时用k来作为一个媒介,先将一个数字的序号  i  保存在 k 中,让 a[k] 与后面的数字 a[j] 进行比较,要是出现上述的情况,则将最小元素的序号保存到 k 中,此时 k 的值就发生了改变,在通过对 k 是否变化进行判断,若变化则将最小的元素与 a[i] 对换,这样一来就保证了每一轮下来 k 中保存的值永远是最小元素的序号,从而达到排序的目的。

PS:认真的朋友应该发现了,在“冒泡排序法”和“选择排序法”的运算结果中代码处理的时间不一样。为什么?因为在理论上讲“选择排序法”比“冒泡排序法”效率要高,因为冒泡排序法无论相邻数字间是什么大小关系,都要一一进行一次对比,但是选择排序则不同。
 

  • 14
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

简十三

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值