文章目录
-
- 算法基础入门
-
- 第一章:排序
-
- 1.1 桶排序
- 1.2 冒泡排序
- 1.3 快速排序
- 1.4 买书问题
算法基础入门
第一章:排序
1.1 桶排序
该算法好比桶,假设有11个桶,编号从0-11。每出现一个数,就往对应编号的桶中放入旗子,只需要数桶中旗子的个数即可。比如2号桶有1个旗子,表示2出现了一次,3号桶有0个旗子,表示3出现了零次,5号桶有2个旗子,表示5出现了两次。
a[0]为0, 表示‘0’没有出现过,不打印
a[1]为0, 表示‘0’没有出现过,不打印
a[2]为1, 表示‘2’出现过1次, 打印2
a[3]为0, 表示‘0’没有出现过,不打印
a[4]为0, 表示‘0’没有出现过,不打印
a[5]为1, 表示‘5’出现过1次, 打印1次
a[6]为2, 表示‘6’出现过2次, 打印2次
a[7]为1, 表示‘0’没有出现过,不打印
a[8]为0, 表示‘0’没有出现过,不打印
a[9]为0, 表示‘0’没有出现过,不打印
a[10]为0,表示‘0’没有出现过,不打印
#include <stdio.h>
int main()
{
int book[101],i,j,input,num;
for(i = 0; i < 101; i++)
{
book[i] = 0;
}
scanf("%d", &num); //表示要输入数字的个数
for(i = 1; i <= num; i++) //输入n个数,进行桶排序
{
scanf("%d", &input); //读取数字
book[input]++; //进行计数
}
for(i=100; i >= 0; i--) //依次进行判断
{
for(j = 1; j <= book[i]; j++) //打印数字,打印的次数为数字出现的次数
{
printf("%d ", i);
}
}
printf("\n"); //输出完后进行换行
return 0;
}
1.2 冒泡排序
基本思想:每次比较两个相邻的元素,若它们的顺序错误就将它们交换过来。
原理:每一趟只能确定将一个数归位
例: 10 6 4 7 2 5 将这6个数进行从大到小的排序。
第一趟:
首先比较第一位与第二位的大小,也就是10与6的比较,10比6大,所以无需交换两个数的位置。
继续比较第一位与第三位的大小,也就是10与4的比较,10比4大,所以无需交换两个数的位置。
继续比较第一位与第四位的大小,也就是10与7的比较,10比7大,所以无需交换两个数的位置。
继续比较第一位与第五位的大小,也就是10与2的比较,10比2大,所以无需交换两个数的位置。
继续比较第一位与第六位的大小,也就是10与5的比较,10比5大,所以无需交换两个数的位置。
第二趟:
首先比较第二位与第三位的大小,也就是6与4的比较,6比4大,所以无需交换两个数的位置。
继续比较第二位与第四位的大小,也就是6与7的比较,6比7小,所以需交换两个数的位置。此时 10 7 4 6 2 5。
继续比较第二位与第五位的大小,也就是7与2的比较,7比2大,所以无需交换两个数的位置。
继续比较第二位与第六位的大小,也就是7与5的比较,7比5大,所以无需交换两个数的位置。
第三趟:
首先比较第三位与第四位的大小,也就是4与6的比较,4比6,所以需交换两个数的位置。此时 10 7 6 4 2 5。
继续比较第三位与第五位的大小,也就是6与2的比较,6比2大,所以无需交换两个数的位置。
继续比较第三位与第六位的大小,也就是6与5的比较,6比5大,所以无需交换两个数的位置。
第四趟:
继续比较第四位与第五位的大小,也就是4与2的比较,4比2大,所以无需交换两个数的位置。
继续比较第四位与第六位的大小,也就是4与5的比较,4比5小,所以需交换两个数的位置。此时 10 7 6 5 2 4。
第五趟:
比较第五位与第六位的大小,也就是2与4的比较,2比4小,所以需交换两个数的位置。此时 10 7 6 5 2 2。
总结:若有n个数进行排序,只需将n-1个数归位,也就是n-1趟,每一趟都需从第一位开始进行相邻两个数的比较,比较完后向后挪一位继续比较下两个数,已经归位的数无需再进行比较。
时间复杂度O(N^2)
#include <stdio.h>
struct Student //创建结构体,存放学生的姓名和成绩
{
char name[20];
int score;
};
int main()
{
struct Student s1[100],temp