排序算法——冒泡排序

排序算法——冒泡排序

冒泡排序思想

将待排序数据序列的相邻两个数据(0,1 1,2 2,3 3,4 。。。 n-2, n-1)进行比较,然后将大的数据向后交换。一趟比较之后,就可以将最大的数据交换到最后。接下来,在对剩余的数据(除过最后一个数据)在进行冒泡排序。经过n-1次后,整个数据序列就有序了。
在这里插入图片描述
例:有这样一个无序数组。将下标0和1的两个数字比较,如果前面比后面大则将两个数字交换,随后继续比较下标1和2两个数字。
在这里插入图片描述
81 与 79 相比 81 大,则将 81 放在 下标2 ,79放在 下标1.
在这里插入图片描述
经过一次从0and1比较一直到8and9比较后
在这里插入图片描述
尽管现在数组依然无序,但是我们将数组中最大的元素99放在了下标9。
这样通过不断的0and1比较再到7and8比较又将第二大的元素放在了下标8。
0and1比较到6and7–5and6–4and5–3and4–2and3–1and2
这个时候除了下标0and1剩下都已经有序
继而在最后比较0and1总共比较 9次!

在这里插入图片描述
冒泡算法
时间复杂度: 等差数列 O(n^2)
空间复杂度: O(1)
稳定性: 稳定的

排序算法的实现

#include<stdio.h>
#include<stdlib.h>
#include<cstdlib>
#include<cstdio>
#include<ctime>


void Show(int* arr, int len)
{
	for (int i = 0; i < len; ++i)
	{
		printf("%d   ", arr[i]);
	}
	printf("\n");
}

void Swap(int* a, int* b)
{
	int c = *a;
	*a = *b;
	*b = c;
}

void IsSort(int* arr, int len)
{
	for (int i = 0; i < len - 1; ++i)
	{
		if (arr[i] > arr[i + 1])
		{
			printf("无序\n");
			return;
		}
	}

	printf("有序\n");
}


void BubbleSort(int* arr, int len)
{
	for (int i = 0; i < len-1; i++)
	{
		int flag = 1;
		for (int j = 0; j < len - i-1; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				Swap(&arr[j], &arr[j + 1]);
				flag = 0;
			}
		}
		if (flag) return;
		/*flag的定义是很巧妙的一个方法来优化速率,
		即数组已经有序而循环还未结束,
		通过flag可以发现某次循环并没有进行数字交换,
		则退出循环排序结束。*/

	}

}




int main()
{
	int arr[10];
	int i;
	srand((unsigned int)time(0));
	for (i = 0; i <= 9; i++)
	{
		arr[i] = rand() % 100;
	}
	Show(arr,10);

	BubbleSort(arr, 10);
	IsSort(arr,10);
	Show(arr,10);



	return 0;
}

在这里插入图片描述
在第一个for里,之所以 i <len -1; 如上面所讲,我们进行9次循环来将数组无序最大数放在正确的位置,所以是 len - 1 。
所以第二个for 为 j < len -i - 1 就很明了了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值