冒泡排序之逐步讲解

来源:互联网 发布:求生之路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
原创粉丝点击