冒泡排序之逐步讲解
来源:互联网 发布:求生之路2 mac 迅雷 编辑:程序博客网 时间:2024/06/06 16:28
1.冒泡排序
1.1不加flag
1.1.1最原始程序
for (int i=0; i<n-1; ++i){for (int j=1; j<n-i; ++j){if (a[j-1] > a[j]){swap(a[j-1], a[j]);<span style="white-space:pre"></span>}<span style="white-space:pre"></span>}}
分析该程序,其中i表示的是遍历整个数组的个数,i=0:n-2,一共n-1次。j=1:n-i-1;该程序内部循环执行的最后一次,j=1,j<2,满足条件。
冒泡排序相当于一次游泳的过程,第一次遍历游到终点,第二次是终点-1。最后一次是只游一步。
问题:能否把n-i整体作为一个变量呢?
1.1.2 n-i整体作为一个变量
int k = n;while(k >0){for (int i=1; i<k;++i){if (a[i-1] > a[i]){swap(a[i-1], a[i]); }<span style="white-space:pre"></span>}k--;}
1.2加入flag
1.2.1 flag为bool类型
int k =n;bool flag = true;while (flag){flag = false;for (int i=0; i<k; i++){if (a[i-1] > a[i]){swap(a[i-1], a[i]);flag = true;<span style="white-space:pre"></span>}<span style="white-space:pre"></span>}<span style="white-space:pre"></span>k--;}
可能这样写,不容易看懂,那如果换成for循环呢,如下所示:
其实,也就是现在的游泳过程,并不是每趟都游,而是根据flag来进行判断。
for (bool flag=true,int k=n; flag == true; k--){flag = false;for (int i=0; i<k; i++){if (a[i-1] > a[i]){swap(a[i-1], a[i]);flag = true;<span style="white-space:pre"></span>}<span style="white-space:pre"></span>}<span style="white-space:pre"></span>k--;}
1.2.2 flag为整型
int k;int flag = n;while (flag>0){k = flag;flag = 0;for (int i=0; i<k; i++){if (a[i-1] > a[i]){swap(a[i-1], a[i]);flag = i;<span style="white-space:pre"></span>}<span style="white-space:pre"></span>}}
该方法相当于把上一次得到的界限,在该趟循环的起始之时,将界限进行替换。精华在于少了一步。
等价于:
int k = n;int flag = n;while (flag>0){flag = 0;for (int i=1; i<k; ++i)<span style="white-space:pre"></span>{<span style="white-space:pre"></span>if (a[i-1] < a[i])<span style="white-space:pre"></span>{<span style="white-space:pre"></span>swap(a[i-1], a[i]);<span style="white-space:pre"></span>flag = i;<span style="white-space:pre"></span>}<span style="white-space:pre"></span>}<span style="white-space:pre"></span>k = flag;}
1.3总结
其中k表示的是每趟游泳的endline(不能到达,实际到达位置为k-1)。无论flag为bool类型还是int类型,都要注意每行初始值为0,如果这趟没有发生交换,则就不会进行下趟活动。
0 0
- 冒泡排序之逐步讲解
- java实现排序算法之冒泡排序法详细讲解
- 冒泡排序详细讲解
- 冒泡排序法 讲解
- 经典算法系列之冒泡排序实战讲解
- 冒泡排序的例题讲解
- 排序之冒泡排序
- 排序之冒泡排序
- 排序之冒泡排序
- 排序之冒泡排序
- 排序之冒泡排序
- 排序之冒泡排序
- 排序之冒泡排序
- 排序之冒泡排序
- 排序之冒泡排序
- 排序之冒泡排序
- 排序之冒泡排序
- 排序之冒泡排序
- 算法积累
- Swift语言iOS开发:CALayer十则示例
- 第三周项目2——三角形类2
- 第三周项目一 三角形类
- 第三周项目三 程序的多文件组织
- 冒泡排序之逐步讲解
- Android 5.0 Service Intent must be explicit
- 第三周项目二 三角形类(2)
- 考了语文数学的学生
- 总结与反思
- JAVA的网络编程【转】
- 第三周项目:程序的多文件组织
- Cocos2d-x动手操作
- android中invalidate()的自动清屏含义以及屏幕刷新