冒泡排序的思想是:相邻两个数进行比较,如果反序则进行交换(注意:是从数组的尾部进比较,冒泡冒泡,从底下往上冒),但是会有这种情况出现:需要排序的数组为:{2,1,3,4,5,6,7},当从小到大排序时,当i = 0时,进行第一次循环比较,循环后的结果时:
{1,2,3,4,5,6,7},可以看出,已经正序,顾后续的比较都没有意义,在代码中加一个标记的变量,当有数据交换时证明下一轮循环可能还需要进行比较,当没有数据交换时说明此次循环已经实现正序,后续循环并不需要,结束掉。
代码如下:
void BubbleSort1(int *arr, int n)
{
int i;
int j;
int tmp;
bool status;
status = true; //定义一个状态,为true的时候表明有数据交换,为false时,表明没有数据交换
for (i = 0; (i < n) && (status != 0); i++) //没有数据交换时退出循环,控制每次冒泡的比较次数,例如第一次两两比较7次,第二次冒泡两两比较6次
{
status = false; //第一次没有数据交换,当一整个轮回的比较没有数据交换时,说明此时已经正序,不用进行余下的比较,结束循环
for (j = n - 1; j > i ; j--) //每次冒泡都从数组的末尾的位置开始,第一次冒泡将最小值冒泡到第一个位置,第二次冒泡将次小值冒泡到第二个位置,此次类推。。。或者从队头开始
{ //for (j = 0; j < n-i-1; j++) 从队头开始两两比较往队尾冒泡 if(a[j] > a[j+1]) swap(a[j],a[j+1])
if (*(arr + j) > *(arr + j - 1))
{
tmp = *(arr + j - 1);
*(arr + j - 1) = *(arr + j);
*(arr + j) = tmp;
status = true;
}
}
}
for (i = 0; i < n; i++)
{
printf("%d\n", *(arr + i));
}
}