最好的冒泡?一个新的冒泡优化思路 -- C

普通的冒泡两个循环,大家都知道,下面的bubble_sort_origin

有一个 优化的方法,就是提前结束第一个循环,避免反复遍历有序的序列bubble_sort_better,这也是网上通用的优化方案

我的bubble_sort_best就是在bubble_sort_better的基础上提前结束第二个循环,避免反复遍历有序的末尾序列

以下是100个2000个元素的随机样本进行三种排序需要比较的次数的截图

可以看到效果虽然小,但是有效果是可以肯定的

是有一次的笔试题给我的启发,可以这样子优化冒泡

  
    
#include < stdio.h >
#include
< stdlib.h >

//
// 最好的冒泡算法,添加一个变量
// 可以同时避免反复比较 尾部的规则序列 和 反复扫描首部的规则序列
//
int bubble_sort_best( int data[], int len)
{
int count = 0 ; // 增加计数,用于计数比较的次数
int i = 0 , j = 0 , m = 0 ;
for (i = len - 2 ;
m
!= - 1 ; // 关键1.m在这里扮演类似swaped的角色,提前跳出规则序列
i = m) // 关键2.把m赋给i,在下次扫描的时候可以使用了
{
//
// 关键3.m在这里扮演类似swaped的角色,提前跳出规则序列
//
m = - 1 ;

for (j = 0 ; j <= i; j ++ )
{
count
++ ;
if (data[j] > data[j + 1 ])
{
data[j]
+= data[j + 1 ];
data[j
+ 1 ] = data[j] - data[j + 1 ];
data[j]
= data[j] - data[j + 1 ];

//
// 关键4.每次交换记录m,m在这个循环跳出后就可以表示不规则序列的最大坐标
//
m = j;
}
}
}
return count;
}

int bubble_sort_better( int data[], int len)
{
int count = 0 ; // 增加计数,用于计数比较的次数
int i = 0 , j = 0 , swaped = 1 ;
for (i = len - 2 ;swaped; i -- )
{
swaped
= 0 ; // 增加swaped变量,网络通常使用的优化手段
for (j = 0 ; j <= i; j ++ )
{
count
++ ;
if (data[j] > data[j + 1 ])
{
data[j]
+= data[j + 1 ];
data[j
+ 1 ] = data[j] - data[j + 1 ];
data[j]
= data[j] - data[j + 1 ];
swaped
= 1 ;
}
}
}
return count;
}

int bubble_sort_origin( int data[], int len)
{
int count = 0 ; // 增加计数,用于计数比较的次数
int i = 0 , j = 0 , m = 0 ;
for (i = len - 2 ;i >= 1 ; i -- )
{
for (j = 0 ; j <= i; j ++ )
{
count
++ ;
if (data[j] > data[j + 1 ])
{
data[j]
+= data[j + 1 ];
data[j
+ 1 ] = data[j] - data[j + 1 ];
data[j]
= data[j] - data[j + 1 ];
}
}
}
return count;
}

int main( int argc, char * argv[])
{
int len = 2000 ;
int data[ 2000 ] = { 0 };
int i = 0 , j = 0 ;
int count = 0 ;

//
// 最原本的冒泡,没有任何优化
//
for (j = 0 ,count = 0 ; j <= 99 ; j ++ )
{
for (i = 0 ; i <= len - 1 ; i ++ )
{
data[i]
= rand() % 2000 ;
}
count
+= bubble_sort_origin(data, len);
}
printf(
" bubble_sort_origin:count_avg \t %d\n " ,count / j);

//
// 网络流行的冒泡算法,添加一个swaped变量来提早结束扫描
//
for (j = 0 ,count = 0 ; j <= 99 ; j ++ )
{
for (i = 0 ; i <= len - 1 ; i ++ )
{
data[i]
= rand() % 2000 ;
}
count
+= bubble_sort_better(data, len);
}
printf(
" bubble_sort_better:count_avg \t %d\n " ,count / j);

//
// 本人的冒泡,添加一个变量m
// 来避免尾部规则序列的重复扫描和swaped的功能
//
for (j = 0 ,count = 0 ; j <= 99 ; j ++ )
{
for (i = 0 ; i <= len - 1 ; i ++ )
{
data[i]
= rand() % 2000 ;
}
count
+= bubble_sort_best(data, len);
}
printf(
" bubble_sort_best:count_avg \t %d\n " ,count / j);



/*
for (i = 0; i <= len - 1; i++)
{
printf("%d\n", data[i]);
}
*/
return 0 ;
}

你可能感兴趣的:(优化)