为什么要总结排序算法:
由于时而要用到排序的思想,这里慢慢总结吧,以前也看的不少,但是荒废久了,也就忘得差不多了,这里贴出供需要的人看吧。互联网虽好,但有时候资源良莠不齐,看的也是头疼,不如总结来供自己查阅。
定位:排序是一种重要的,基本的算法。
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
持续更新中......