今天我的内心受到了打击,原来我是个彻头彻尾的垃圾,一个冒泡排序写了我三个小时。以后要经常找点算法的题目来练练手。(蓝色是忧伤的颜色?)
今天我就把这道醍醐灌顶的冒泡排序算法总结一下。
一个上升排序,不过,今天这个总结不仅仅是算法,还有vim练习,以及makefile初识。
用到的资料: 《啊哈!算法》、《学习vi和vim编辑器》、《跟我一起写 Makefile》。
用到的软件:ubuntu操作系统、gcc-4.4.7、vim-7.3.429。
首先确定需要的函数,main函数不用说,还有一个就是Sort_Up函数,我们把main放在main.c里,Sort_Up放在sort.c里,这是一个上升排序,如下所示:
main函数(注释掉的部分是桶排序)
1 #include <stdio.h>
2 #include "sort.h"
3 int main(void)
4 {
5 /*
6 int a[1001], i, j, t;
7
8 for (i = 0; i < 1001; i++){
9 a[i] = 0;
10 }
11
12 for (i = 0; i < 5; i++){
13 scanf("%d", &t);
14 a[t]++;
15 }
16
17 for (i = 1000; i >= 0; i--){
18 for(j = 0; j < a[i]; j++){
19 printf("\n\n%d\n\n", i);
20 }
21 }
22 */
23 int a[5], temp, i;
24 for (i = 0; i < 5; i++){
25 scanf("%d", &temp);
26 a[i] = temp;
27 }
28 Sort_Up(a, 5);
29 for(i = 0; i < 5; i++){
30 printf("\n\n%d\n\n", a[i]);
31 }
32 }
Sort_Up函数
1 #include <stdio.h>
2 #include "sort.h"
3
4 void Sort_Up(int *array, int n)
5 {
6 int i, j, temp;
7 for (i = 0; i < n - 1; i++){
8 for (j = 0; j < n - i - 1; j++){
9 if(array[j] > array[j + 1]){
10 temp = array[j];
11 array[j] = array[j + 1];
12 array[j + 1] = temp;
13 }
14 }
15 }
16 }
这个函数的基本思想是这样的:一个数组中存放了一组数据,将第一个数据与第二个数据比较,如果第一个数据比第二个大,那么它们就交换,否则就不交换;接着第二个数据与第三个数据比较,如果第二个数据比第三个数据大,就将他们交换,否则不交换,以此类推,直到将最大的数据放在数组末端,到这时最大的数据找到了。然后开始找第二大的数据,从第一个开始仿照找第一大的方法去找第二大的数据,把它排到第二大的数据后面,以此类推直到把所有的数据排完序。在程序上的表现就是二级嵌套循环,第一级用来确定要寻找第几大数据排序,第二级用来寻找这个数据。 函数写完之后,我得到了三个文件:main.c、sort.c、sort.h,接下来要组织它们来写makefile文件,如下所示
1 objects = main.o sort.o
2 main : $(objects)
3 cc -o main $(objects)
4 main.o : main.c sort.h
5 cc -c main.c
6 sort.o : sort.c sort.h
7 cc -c sort.c
8 clean:
9 rm main.o main
这个文件的具体语法就不解释了,去耗子叔博客里找《跟我一起写 Makefile》,如果不知道耗子叔是谁,那你应该打开浏览器花一段时间去了解一下这位大神。
冒泡算法的核心是一个双重嵌套循环,这个嵌套循环的时间复杂度是
O
(
N
2
)
O(N^2)
O(N2),这是一个非常高的时间复杂度,所以它没有什么太大用处。