(图片源于菜鸟教程)
冒泡排序用两个for循环,外部for循环是趟数,内部for循环是控制相邻两个数比较。
从下标为0的数开始到n-1结束,依次比较它与相邻后面那个数的大小(内部for循环),如上图所示,每趟排序当前未排的最大的数将被交换到最后一个,如泡泡浮到顶。每一趟完成一个数的排序,n个数需要n趟排序。
完成该步骤后开始第二趟排序(里面的for循环结束一次),第二次排序时,由于上一趟已经排好一个数,则比较相邻的数可以减少一次(已经排i趟则减少i次比较)
普通的冒泡排序:
void Swap(int *x, int *y)
{
int tmp;
tmp = *x;
*x = *y;
*y = tmp;
}
void Sort_Bubb(int* num, int n)
{
int tmp;
int* p = num;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n-1-i; j++)
{
if(num[j]>num[j+1])//*(num+j)跟num[j]一样
Swap(&num[j], &num[j + 1]);
}
}
}
纯指针冒泡排序
指针比数组更快
//交换
void Swap(int *x, int *y)
{
int tmp;
tmp = *x;
*x = *y;
*y = tmp;
}
//冒泡排序,纯指针更快
void Sort_Bubb(int* num, int n)
{
int tmp;
int* p = num;//p指向头
int* end = num + n;//end指向尾
int* q = num;//q指向头
for (p = num; p < end; p++)
{
for (q = num; q < end-1; q++)//q和p不必联系
{
if(*q > *(q+1))//比较相邻两个数大小
Swap(q, q+1);//把大的移到后面
}
}
}
注意:用if(*(num+j)>*(num+j+1))并非纯指针,因为*(num+j)跟num[j]一样,实际上还是下标表示的
测试结果: