您的位置:首页 > 其它

【算法1】之冒泡排序极其优化

2014-04-22 00:35 204 查看
冒泡排序怕是所有人开始学习算法接触的第一个例子吧。

很好理解其过程:

1、给定一个数组,第一轮循环中比较相邻两个元素的大小,如果前面元素大于后面的就交换两个元素。这样第一轮结束就保证最大的元素在最后一个。

2、进入第二轮循环,直到循环次数等于数组个数。

冒泡排序是稳定排序算法。

给出自己的实现:

#include "stdafx.h"
#define  _Count sizeof(p) / sizeof(p[0])
int _tmain(int argc, _TCHAR* argv[])
{
int p[] = { 100, 30, 50, 70, 90,1000,101,1020,103,560,78 };
int tmp;
for (int i = 0; i < (_Count); i++){
for (int j = 1; j < (_Count); j++){
if (p[j-1]>p[j])
{
tmp = p[j];
p[j] = p[j-1];
p[j-1] = tmp;
}
}
}
for (int k = 0; k < (_Count); k++){
printf("%d  ", p[k]);
}
return 0;
}


简单说一下我定义的一个宏,它的功能就是计算出数组元素的个数,用户就不用输入个数了。

思考:

如果数组中只有前面两个数需要排序,后面都是有序的怎么优化算法?

答案:

设置一个bool类型的标志,如果某次循环没有发生交换,那么就可以说数组已经有序。代码如下:

#include "stdafx.h"
#define  _Count sizeof(p) / sizeof(p[0])
int _tmain(int argc, _TCHAR* argv[])
{
int p[] = { 100, 30, 50, 70, 90, 1000, 101, 1020, 103, 560, 78 };
int tmp,n=1;
bool flag = true;
while (flag){
flag = false;
for (int j = 1; j < (_Count); j++){
if (p[j - 1]>p[j])
{
tmp = p[j];
p[j] = p[j - 1];
p[j - 1] = tmp;
flag = true;
}
}
printf("%d\n", n++);
}
for (int k = 0; k < (_Count); k++){
printf("%d  ", p[k]);
}
return 0;
}


在这里我设置了一个n,用于表示出循环执行了多少次,明显优化后可以减少执行次数。

最后发个连接,

动态比较冒泡排序和快速排序的经典动画
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: