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

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

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

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

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

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

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

#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;
}

相关文章:

  • 2022-12-23
  • 2022-01-06
  • 2021-05-16
  • 2022-01-06
  • 2021-04-21
  • 2021-06-08
猜你喜欢
  • 2022-01-20
  • 2022-12-23
  • 2021-08-29
  • 2022-12-23
  • 2022-01-19
相关资源
相似解决方案