为什么要总结排序算法:
由于时而要用到排序的思想,这里慢慢总结吧,以前也看的不少,但是荒废久了,也就忘得差不多了,这里贴出供需要的人看吧。互联网虽好,但有时候资源良莠不齐,看的也是头疼,不如总结来供自己查阅。
定位:排序是一种重要的,基本的算法。
1、冒泡(起泡)法排序(2018/06/04 pm 17:20):
基本思路:每次将相邻的两个数比较,将小的调到前头。若有6个数:9 8 5 4 2 0;比较过程如下图:
第一趟比较:
9 8 |
8 |
8 |
8 |
8 |
8 |
9 5 |
5 |
5 |
5 |
5 |
|
5 |
9 4 |
4 |
4 |
4 |
|
4 |
4 |
9 2 |
2 |
2 |
|
2 |
2 |
2 |
9 0 |
0 |
|
0 |
0 |
0 |
0 |
9 |
|
第1次 |
第2次 |
第3次 |
第4次 |
第5次 |
结果 |
第1次:先将最前面的两个数(8和9)比较大小,小的浮上去,大的沉下去;
第2次:将第2和第3个数(9和5)比较,同理,小的浮上去,大的沉下去;
如此进行5次,得到8 5 4 2 0 9 的顺序,可以看到最大的数9已经“沉底”。其他数各自向上浮起一个位置。
第二趟:
8 5 |
5 |
5 |
5 |
5 |
8 4 |
4 |
4 |
4 |
|
4 |
8 2 |
2 |
2 |
|
2 |
2 |
8 0 |
0 |
|
0 |
0 |
0 |
8 |
|
第1次 |
第2次 |
第3次 |
第4次 |
结果 |
然后进行第2趟比较,对余下的5个数(8 5 4 2 0)进行新一轮的比较,以便使次大的数“沉底”。
方法同第1趟,如上表示,经过4次比较,得到次大的数8。
规律总结:
按如此规律进行下去,可以推知,对6个数进行冒泡排序,要比较5趟,才能使6个数按大小排序。
在第1趟要进行两个数之间的比较共5次,在第2趟过程中比较4次,..........,在第5趟只需比较1次。
规律升华:
如果有n个数,则要进行n-1趟比较。在第1趟比较中要进行n-1次两两比较,在第j趟比较中要进行n-j次两两比较。
下面给出简单c程序:
#include <stdio.h> int main() { int a[10]; //此数组用于存放输入数据 int i, j; //循环变量 int t; //中间变量 printf("input 10 numbles:\n"); //输入数据提示 for(i = 0; i < 10; i ++) scanf("%d", &a[i]); printf("\n"); //冒泡排序部分 for(j = 0; j < 9; j ++) //进行9次循环,实现9趟比较 for(i = 0; i < 9 - j; i ++) //在每一趟中进行 9 - j 次比较 if(a[i] > a[i + 1]) { t = a[i]; a[i] = a[i + 1]; a[i + 1] = t; } printf("the sorted numbers:\n");//排序输出 for(i = 0; i < 10; i ++) printf("%d ", a[i]); printf("\n"); return 0; }
在Code::Blocks中运行结果如下:
input 10 numbles:
15 25 12 36 52 21 15 45 52 61the sorted numbers:
12 15 15 21 25 36 45 52 52 61
持续更新中......