文章目录
- 前言
- 冒泡排序
- 题目
- 题目一
- 题目二
- 小结
前言
(1)在本章的学习此前,需要复习前一章的内容,动手敲一遍代码解题。
(2)经过上一章的操练以后,大家应该体会到了,简化版桶排序所要申请的数组的容量大小由要排序的数中的最大值决定,所以如果我们要排序的数中最大值是210000000,那我们还得申请一个大小为210000001的数组,毫无疑问,非常浪费空间!
(3)而且,简化版桶排序的i表示数值,book[i]表示数值的数量,由于数组要求book[i]中的i的类型必须为整数,所以,如果要排序的存在小数,那简化版桶排序就失效了!
本章的学习目标:
(1)学习冒泡排序原理
(2)会用冒泡排序联系实际生活,解决编程问题
冒泡排序
(1)冒泡排序的基本思想是:每次比较两个相邻的元素,如果他们的顺序错误就把它们交换过来。
(2)代码思路:如果有n个数进行从大到小排序,只需将n-1个数归位,也就是说要进行n-1趟操作。而”每一趟“都需要从第1位开始进行两个数的比较,将较小的一个数放在在后面,比较完毕后向后挪一位继续比较下面两个相邻数的大小,重复此步骤,直到最后一个尚未归位的数,已经归位的数则无需再进行比较(已经归位的数你还比较个啥,浪费表情)。
题目
题目一
输入n个整数,对它们用冒泡排序按从小到大或者是从大到小的顺序排列,并打印出来。
#include <stdio.h>
int main()
{int a[100], i, j, t, n;scanf("%d",&n);for (i = 1; i <= n; i++)scanf("%d",&a[i]);//冒泡排序的核心部分for (i = 1; i <= n - 1; i++){for (j = 1; j <= n - i; j++){//a[j] > a[j + 1]——从小到大排序;a[j] < a[j + 1]——从大到小排序if (a[j] > a[j + 1]) //若a[j] > a[j + 1],则a[j] 与 a[j + 1]调换位置,即大的放数组后面,故实现从小到大排序{t = a[j]; a[j] = a[j + 1]; a[j + 1] = t;}}}//数组内的数据已排好序,这一步按顺序打印出数组内的数值for (i = 1; i <= n; i++) //若i = 1; 则i <= n;要加等号printf("%d ",a[i]);return 0;
}
题目二
读入n个人的人名和分数,按分数从大到小排序,打印出分数对应的人名。
#include <stdio.h>
struct student
{char name[21];char score;
}; //这里创建了一个结构体,用来存储姓名和分数
int main()
{struct student a[100], t;int i, j, n;scanf("%d",&n); //多少个人for (i = 1; i <= n; i++)scanf("%s %d",a[i].name,&a[i].score);//按分数从高到低进行排序for (i = 1; i <= n - 1; i++){for (j = 1; j <= n - i; j++){if (a[j].score < a[j + 1].score) //按从达到小顺序排序{t = a[j]; a[j] = a[j + 1]; a[j + 1] = t;}}}for (i = 1;i <= n; i++) //i = 1;i <= n;printf("%s\n",a[i].name);return 0;
}
小结
冒泡排序的核心部分是双重嵌套循环,不难看出冒泡排序的时间复杂度是O(N^2)。这是一个非常高的时间复杂度,后面也没有人能成功把冒泡排序改进。
Have a nice day!