冒泡排序法_【C语言】冒泡排序法与选择排序法

C语言编程必掌握的两种排序方法:冒泡排序法和选择排序法

首先要看图自己梳理一遍规律和思路(这很重要)

或是在往下看的过程反复搭配动图进行理解,非常感谢制作这两幅动图的人,可以让大家比较直观的理解冒泡排序法和选择排序法

冒泡排序法

ba3bc57b7ad2a83943f037005e5ecb1e.gif
图片来自网络(侵删)

整体思路(具体看代码)

冒泡排序法就是将 一堆数 从前往后 两个两个 逐个扫描,两个数将大的数放到后边,这样扫一遍,就可以在这堆末尾排好一个数(你可以理解为从前往后扫,把大的数从后依次往前排),仔细观察,扫描一次,排好一个数,有十个数,扫九次就排好了,(别问为什么是九次,你想想后面九个数排好了第一个数还用排吗)所以编程首先要有一个for循环在最外层for(i=0;i<9;i++)来控制扫描的遍数,其次你要往过“扫”啊,这个“扫”的过程也就是两个数两个数比较排列的过程,所以要在前面的for循环里再放一个for循环for(i=0;i<9-n;i++),用这个for循环往后扫,在这个循环里用if语句判断,如果前一个数大于后面那个数,就交换两个数。

以下代码搭配动图食用

#include<stdio.h>
main()
{
 	int n,i,j,k,a[10];//定义变量

 	printf("输入十个数:n");//通过循环给a这个数组输入十个数
 	for(i=0;i<10;i++)
  		scanf("%d",&a[i]);
  		printf("n");  //回车换行 

 	for(n=0;n<9;n++)//这个循环是整体扫描十个数的次数,扫一次排好一个数,扫九次
 	{               //故循环九次
  		for(i=0;i<9-n;i++)//这里控制扫描的过程
  		{     //这个i<9-n是控制扫描的这堆数的哪里
                      //因为扫一次在末尾排好一个数,排好的数不用扫了,所以需要扫描的数少一位
   			if(a[i]>a[i+1])
   			{
    			j=a[i];//以下三行语句是交换两个数
    			a[i]=a[i+1];
    			a[i+1]=j;
   			}
  		}
 	}
 	for(k=0;k<10;k++)//通过循环将排好的数从数组中逐个输出
  	printf("%d,",a[k]);
 	printf("n");
}

选择排序法

9d714a0dceef7358fe160e9367efdf26.gif
图片来自网络(侵删)

整体思路(详细看代码)

选择排序法是将一堆数,从前往后逐个扫描

比如说有十个数,从前往后扫描一遍就在前面排好了一位数

那么要排好十个数就要扫描九遍(九个数排好了第十个数就不用排喽)

这样就需要在最外层放一个大循环,控制扫描九次

在扫描一遍的过程需要从前往后边扫描要边记录最小的那个值,最后一步进行替换

在大循环里,也就是从前往后扫描一遍,这需要另一个小循环,从前往后一个一个的读数据

这里要注意写代码的细节:因为在前面排好一个数这个数就不用扫描了,也就是每次扫描的起点是上一次扫描的后一位数,那么在写代码的时候就要注意让小循环循环的起点从上次排好的位置开始

这个小循环在控制从前往后读数的同时也要比较记录最小的数(记住是比较记录,此时不需要进行数字位置的互换,只需记录最小值的“位置”)

然后在扫描一遍完毕后,要进行数字交换,将最小数放到此次扫描的最前面,也就是和此次扫描最前面的那个数交换,而最前面的那个数就要在每次扫描之前标记好,所以要在大循环下紧跟一个k=i(仔细观察就会发现大循环第一次循环时扫描是从第一个数开始的,第二次循环扫描是从第二个数开始的,所以k=i)

#include "stdio.h"
int main()
{
	int i,j=0,k,t;
	int a[10];
	printf("请输入十个数进行排序:n");
	for(i=0;i<10;i++)
	scanf("%d",&a[i]);
	printf("n");
	
	for(i=0;i<=8;i++)//十个数总共要扫描九次
	{
		k=i;//定位每次排好数的位置
		for(j=i;j<=9;j++)//i=j每次从上次排好的数开始扫描
		{
			if(a[j]<a[k])//比对大小,记忆小的那个数组元素的下标
			k=j;
		}
		t=a[k];//扫描完一遍后就将最小的那个数换到前面
		a[k]=a[i];
		a[i]=t;
		
	}
	printf("输出排序结果:");
	for(i=0;i<10;i++)
	{
		printf("%2d",a[i]);
	}
	return 0; 
}

如有错误或建议请于评论区指出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值