【初学者入门C语言】之算法篇(冒泡排序和选择排序)

个人主页:天寒雨落的博客_优快云博客-C,优快云竞赛,python领域博主

💬 刷题网站:一款立志于C语言的题库网站蓝桥杯ACM训练系统 - C语言网 (dotcpp.com) 

 特别标注:该博主将长期更新c语言内容,初学c语言的友友们,订阅我的《初学者入门C语言》专栏,关注博主不迷路!

目录

一、冒泡排序

1.原理

2.举例

        1.题目

         2.代码

        3.执行结果

二、选择排序

1.原理

2.举例

1.题目

2.代码

3.运行结果


一、冒泡排序

1.原理

        它从头到尾每次都对相邻的两个数进行比较,将较大(或较小)的数交换到后一个元素中,每一轮的比较都在没有排好的数据中,找出最大数(或最小数)放在这些数的后面。

通俗的说就是当我们上体育课的时候会排身高,那么就要最高的站到最后面,老师就要先从一号开始看,用一号跟二号比较,如果一号更高,那么他们俩换位置,一号站第二排,二号站第一排,如果不然,则不换。接着比较二排的和三号的身高,如果三号更高,重复上面的操作,直到比较到最后一个人。

假设10个人排队int a[10];

比较第一轮:

for(int j=0;j<9;j++){

        if(a[j]>a[j+1]){

                t=a[j];

                a[j]=a[j+1];

                a[j+1]=t;

}

}//需要比较9次

比较第二轮

for(int j=0;j<8;j++){

        if(a[j]>a[j+1]){

                t=a[j];

                a[j]=a[j+1];

                a[j+1]=t;

}//需要比较8次(不在比较上一轮已经排好的)

......

上面说的只是把最高的排到了最后一排,还有第二高,第三高的呀,所以此时有需要一个for循环保证高的人都在他们应该在的位置,那么第二次排的时候,我们还需要管那个最高的人吗?当然不用啊,他都已经排好了,不用再动他了所以控制比较的循环变量是小于控制人数的循环变量的

直接用两个for循环

for(int i=0;i<9;i++){

        for(int j=0;j<9-i;j++){

                if(a[j]>a[j+1]){

                        t=a[j];

                        a[j]=a[j+1];

                        a[j+1]=t;

               }

        }

}

2.举例

        1.题目

输入10个数对其进行排序

         2.代码

#include "stdio.h"

int main() {
	int t, a[10];

	for (int i = 0; i < 10; i++) {
		scanf("%d", &a[i]);
	}

	for (int i = 0; i < 9; i++) {

		for (int j = 0; j < 9 - i; j++) {

			if (a[j] > a[j + 1]) {

				t = a[j];

				a[j] = a[j + 1];

				a[j + 1] = t;

			}

		}

	}

	for (int i = 0; i < 10; i++) {
		printf("%d\t", a[i]);
	}

	return 0;
}

        3.执行结果

二、选择排序

1.原理

        它是找出最大数(或最小数)放到最前面,它不再是数组前后比较,而是在一轮里一直拿一个位置数跟后面的比较。

        通俗的说就是在排队的时候,先拿一号依次跟后面的每一个人都比较,如果和它比较的人比一号小,则他俩换位,小的这个人站第一排,拿这个人跟后面比,以此类推,确保第一个是最低的。第二轮从第二个人开始,重复上面的操作,不在动排好的人

假设10个人排队int a[10];

比较第一轮:

for(int i=0;i<9;i++){

for(int j=i+1;j<10;j++){

        if(a[i]>a[j]){

                t=a[i];

                a[i]=a[j];

                a[j]=t;

}

}

需要注意的是for循环里的三个表达式,我们已经把第一个赋给max,所以就直接从第二个开始,也就是从索引1开始,i小于10

2.举例

1.题目

输入10个数对其进行排序

2.代码

#include "stdio.h"

int main() {
	int t, a[10];

	for (int i = 0; i < 10; i++) {
		scanf("%d", &a[i]);
	}

	for (int i = 0; i < 9; i++) {

		for (int j = i + 1; j < 10; j++) {

			if (a[i] > a[j]) {

				t = a[i];

				a[i] = a[j];

				a[j] = t;
			}

		}

	}

	for (int i = 0; i < 10; i++) {
		printf("%d\t", a[i]);
	}

	return 0;
}

3.运行结果

各位C语言的初学者有问题随时都可以问我,随时为您解惑!!!

👍+✏️+⭐️是对博主最大的鼓励与支持!!!

评论 45
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

天寒雨落

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

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

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

打赏作者

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

抵扣说明:

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

余额充值