冒泡排序和纯指针的冒泡排序

 

(图片源于菜鸟教程)

        冒泡排序用两个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]一样,实际上还是下标表示的

测试结果: 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

曦樂~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值