冒泡排序

思路:

有n个元素,需要冒n-1次泡,就如有两个元素,只需冒一次泡就可以比较出大小,而且每冒一次泡就能找到一个最大值

每轮冒泡少一个元素

每次冒泡,两两交换,大数往后放(假设是升序排列)


数组冒泡

#include<stdio.h>
#include<assert.h>
#include<Windows.h>

void bubble_sort(int arr[], int len)
{
	assert(arr);  //判断数组arr不为空
	int i = 0;
	for (; i < len - 1; i++)     //i控制外循坏,代表冒多少次泡
	{

		int j = 0;
		int flag = 0;  // 判断数组是否已经有序

		for (; j<len - 1 - i; j++)//j控制内循坏,表示每次冒泡需比较多少个元素,减i是因为每次冒泡少一个元素
		{
			if (arr[j]>arr[j + 1])
			{
				arr[j] ^= arr[j + 1];
				arr[j + 1] ^= arr[j];
				arr[j] ^= arr[j + 1];
				flag = 1;
			}

		}
		if (flag == 0)//说明未经过if判断,已经是有序的
		{
			break;
		}

	}
}
	
int main()
{
	int arr[] = { 1, 48, 25, 6, 56, 30, 9, 17, 32, 52, 12 };
	int len = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, len);
    int i;
	for (i = 0; i < len; i++)
	{
		printf("%d  ",arr[i]);
	}
	system("pause");
	return 0;
}

指针冒泡

#include<stdio.h>
#include<assert.h>
#include<Windows.h>

void bubble_sort(int arr[], int len)
{
	assert(arr);
	int *start = arr;
	int *end = arr + len - 1;
	while (end > arr)
	{
		int flag = 0;
		for (start = arr; start < end; start++)
		{
			if (*start > *(start + 1))
			{
				flag = 1;
				*start ^= *(start + 1);//start最大是end-1,即倒数第二个元素,所以start+1是可以的
				*(start + 1) ^= *start;
				*start ^= *(start + 1);
			}
		}
		if (flag == 0)
		{
			break;
		}
	end--;	
	}
	
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值