以下是冒泡排序的C代码:
//冒泡排序
void bubbleSort(int *pBuff, int len)
{
for (int i = 0; i < len; i++)
{
for (int j = len - 1; j > i; j--)
{
if (pBuff[j-1] > pBuff[j])
{
int temp = pBuff[j - 1];
pBuff[j - 1] = pBuff[j];
pBuff[j] = temp;
}
}
printBuffer(pBuff, 10);
}
}
用以下数组测试:
int iBuff[10] = { 3,7,9,0,8,4,1,2,5,6 };
运行结果如下:
如上图,白色部分为无用循环。冒泡排序的本质是相邻的数据比较,满足条件后交换。当内循环内不再有数据交换是,此时排序已完成,所以通过这个条件可以省去后续的无用循环次数而加快速度。下面是优化后的代码:
//冒泡排序
void bubbleSort(int *pBuff, int len)
{
for (int i = 0; i < len; i++)
{
int iflag = 0;
for (int j = len - 1; j > i; j--)
{
if (pBuff[j-1] > pBuff[j])
{
int temp = pBuff[j - 1];
pBuff[j - 1] = pBuff[j];
pBuff[j] = temp;
iflag = 1;//标记本次循环进行了数据交换
}
}
//如果不再进行数据交换说明排序已完成
if (0 == iflag)
return;
printBuffer(pBuff, 10);
}
}
下面是运行结果:
比较以上两次的结果,可以看到优化后的冒泡排序不再进行无效循环。