冒泡排序法

来源:互联网 发布:阿里云网站备案查询 编辑:程序博客网 时间:2024/05/18 03:45

排序经常用到,冒泡排序的思想,就是和水泡一样,浮向水面,一个一个地将最大或者是最小的那个数移止最前或者是最后的位置。不好表达,下面以程序为例子分析。

#include <iostream>using namespace std;int a[8] = { 100, 25, 58, 26, 6, 85, 75, 49 };void main(){int n = 8;int data = 0;//注意次数的i、j的初始化的值和后面的小于的起始范围for (int j = 0; j < n; j++){for (int i = 1; i < n- j; i++){if (a[i-1] > a[i]){data = a[i];a[i] = a[i - 1];a[i - 1] = data;}}}for (int m = 0; m < n; m++)cout << a[m] << endl;}
运行结果如下

冒泡排序一般是两层for循环。第一层循排环的范围上限就是需要序点的个数,第二层for循环的起始可以是0也可以是1,这取决于循环的下面比较的时候,变量下标的写法。

本次中,如果比较方式是a[i] < a[i-1],那么第二层循环的起始是1,因为要是i-1最小取值到0,则i的最小应该为1,第二层的上限就是n-j,因为当j=0的时候,i的最大取值就是n-1。如果下标是a[i] < a[i+1],则第二层的起始是0,第二层的上限是n-j-1,因为当j=0的时候,要是i+1的最大取值是n-1,所以上限是n-j-1。

第二层的上限,冒泡的思想是,比如在从小到大排序的时候,先将所有数中的最大的冒泡到数组顶端,再在剩余的n-1个数中冒泡最大的到数组的次顶端,依次类推。所以,上限是n-i,当i为3的时候,说明已将前三个最大的数已经被“冒泡”到数组最前面的三个位置。

总结下循环是下面两种方式:

/方式1for (int j = 0; j < n; j++){for (int i = 1; i < n - j; i++){if (a[i - 1] > a[i]){data = a[i];a[i] = a[i - 1];a[i - 1] = data;}}}//方式1for (int j = 0; j < n; j++){for (int i = 0; i < n - j -1; i++){if (a[i] > a[i+1]){data = a[i+1];a[i+1] = a[i];a[i] = data;}}}

其实对于冒泡法,第一次层的上限可以是n-1,也就是第一层循环可以只循环n-1次,因为当i = n -1的时候,n个数中已经有n-1个数“冒泡”好,所以第n个数就不需要再冒泡一次了。

综上:冒泡排序两层循环,第一层的起始是0,上限可以是n,也可以是n-1; 第二层循环的起始和上限由比较的下标决定。


0 0
原创粉丝点击