冒泡排序和选择排序,快速到位

为什么要使用这两种排序方式(必看)

假如我们手头有一些数字积木,要按数字的大小顺序整理好,我们只要审好题,直接上手就能排,就这样…那样…那样…这样…就排出来了。需要我们进行陈述时却觉得表达不清,毫无章法,所谓只可意会不可言传。这是因为大家智商都差不多,够用了,但是要创造程序,我们还要思路清晰,整体流程设计尽量没有冗余,因此,设计程序是对我们自身思路的整理,是挑剔的。同样,能够根据题目梳理出最简单的运行逻辑显得尤为必要。

那么有没有非常简单的逻辑方式进行排序,以方便我们更容易梳理思路,编写代码呢?当然有,我们可以以最值寻找。
比如数字,按照由小到大的顺序排列:
第一种,每次都寻找数字中的最小值,放在序列的开头,依此做执行;
第二种,每次都寻找数字中的最大值,放在序列的末尾,依此做执行。
其中,第一种叫做选择排序,第二种叫做冒泡排序。所以啊,"冒泡"和"选择"两个字眼不过是两种最简单的排序方式的称呼罢了。

冒泡排序

根据“每次都寻找数字中的最大值,放在序列的最末尾”这句话,不难延伸出:当我们用两个数值(比如10和20)做比较时,要使较大的数值,排在后面(即20排在10的后面:10 20)。所以原序列以每次比较两个数字做判断的话,每次都要保证比较后较大的数字往后移动,才能保证一圈下来最大的数字在最末尾。代码如下:

// An highlighted block
void maoPao()
{
	int n;
	printf("请输入数字元素个数:");
	scanf("%d",&n);
	int a[n];
	int i, j, t;
	printf("请输入这%d个要排序的数字值:\n",n);
	for (i = 0; i < n; i++){
		scanf("%d", &a[i]);//输入需要排序的数字
	}
	for(i=0;i<n-1;i++)//执行的圈数为n-1圈,所以i范围[0,n-2]里有n-1个元素,即此for循环可执行n-1圈
		for(j=0;j<n-1-i;j++)//元素的数组下标号范围,所比较元素a[j]和a[j + 1],数组元素下标号从0到n-1,每一圈确定一个最末尾元素,i从0开始,所以每圈的数组下标号为[0,n-1-i],所以在a[j]和a[j + 1]中,j的最小值为0,j+1可以取到n-1-i,即j范围[0,n-2-i]。
			if (a[j] > a[j + 1]){//如果元素值大的在前边,就交换
				t = a[j];
				a[j] = a[j + 1];
				a[j + 1] = t;
			}//将其依次进行比较,并进行调换
	for (i = 0; i <n; i++)
		printf("%d\t", a[i]);//输出排序后的结果
	return 0;
}

选择排序

每次都寻找数字中的最小值,放在序列的开头”:(对比冒泡,自行解释),代码如下:

// An highlighted block
void maoPao()
{
	int n;
	printf("请输入数字元素个数:");
	scanf("%d",&n);
	int a[n];
	int i, j, t;
	printf("请输入这%d个要排序的数字值:\n",n);
	for (i = 0; i < n; i++){
		scanf("%d", &a[i]);//输入需要排序的数字
	}
	for(i=0;i<n-1;i++)//和冒泡排序执行的圈数一样多
		for(j=i+1;j<n;j++)//比较元素使用a[0+i]和a[j],每圈数组元素下标号[0+i,n-1],在a[i]和a[j]中,i作为最左端,j左边可以取到0+i+1,右边可以取到n-1,即j范围[i+1,n-1]。
			if (a[i] > a[j]){//如果元素值大的在前边,就交换
				t = a[i];
				a[i] = a[j];
				a[j] = t;
			}//将其依次进行比较,并进行调换
	for (i = 0; i <n; i++)
		printf("%d\t", a[i]);//输出排序后的结果
	return 0;
}

附录:冒泡排序和选择排序简略图(箭头表示大值/小值 往后/往前移)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值