本帖最后由 Stillmind 于 2016-12-27 15:47 编辑
特别喜欢C语言,所以发表一篇简单的C语言代码分析作为第一篇帖
记忆中原始的冒泡排序应该是这样的:
void fun(int a[],int n)
{
int i,j.t;
for(i = 1;i <= n-1;i++)
for(j = 0;j < n-1-i;j++)
if(a[j] > a[j+1])
{
t = a; a[j] = a[j+1];
a[j+1] = t;
}
}
有这样一种情况:在i逼近n-1的途中,数组可能已经是有序状态了,但循环仍然要继续到i=n-1时才会停止,事实上后面的循环都是多余的。见到过增加Flag标志的优化方式,如下:
void fun(int a[],int n)
{
int i,j.t;
int flag;
for(i = 1;i <= n-1;i++)
{
flag = 0;
for(j = 0;j < n-1-i;j++)
if(a[j] > a[j+1])
{
t = a; a[j] = a[j+1];
a[j+1] = t;
flag = 1;
}
if(flag == 0)
break;
}
}
flag标志就是为了避免这种不必要的浪费,从而提高了执行效率。i每增加1,内循环都会对数组完成一次遍历,如果内循环结束了都没有数据的交换,则flag值不变,仍然为0,表示数组已经处于有序状态了,故break,停止循环,否则i继续增加1,内循环继续遍历。
大概的过程就是这样。