我的任务是编写冒泡排序修改,其中比较次数减少了一半。
我已经编写了标准的冒泡算法:
void bubble_sort(int* tab, int roz)
{
int test;
for (int i = 0; i < roz; i++)
{
for (int j = 1; j < roz; j++)
{
if (tab[j - 1] > tab[j])
{
test = tab[j - 1];
tab[j - 1] = tab[j];
tab[j] = test;
}
}
}
}
如何修改它以完成任务?代码看起来如何?
答案 0 :(得分:2)
您可以使用以下方法优化您的解决方案:
在算法的第一次迭代中,您确定最后一个元素是最大的。所以它已经有序了。无需循环到内循环中的数组末尾。
在每次新迭代中,还有一个元素是有序的。因此,您可以将下一个内循环计数减少1。
我冒昧地修改了你的解决方案。
int lastUnsorted = n - 1;
bool isSorted = false;
while (!isSorted)
{
isSorted = true;
for (int i = 0; i < lastUnsorted; i++)
{
if (arr[i] > arr[i + 1])
{
isSorted = false;
int temp = arr[i + 1];
arr[i + 1] = arr[i];
arr[i] = temp;
}
}
lastUnsorted--;
}
答案 1 :(得分:1)
您可以将for (int j = 1; j < roz; j++)
更改为for (int j = 1; j < roz-i; j++)
,以迭代数组中未排序的元素。这将步数从88减少到68,减少了大约四分之一。