C语言 ——— 冒泡排序(只适用于整型数组)

目录

冒泡排序实现功能

 冒泡排序实现逻辑 

确定冒泡排序的趟数

 每一趟冒泡排序的内容

插旗小技巧

话不多说,上代码


冒泡排序实现功能

  • 对无序的整型数组进行排序
  • 将整型数组排序排成升序 

 冒泡排序实现逻辑 

要实现冒泡排序首先要确定冒泡排序的趟数,其次再实现每一趟冒泡排序的内容

确定冒泡排序的趟数

 冒泡排序的核心思想为:两两相邻的元素进行比较

例如要排序的数组为:int arr[10] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};

arr数组为降序,也就是需要升序的数组的最坏情况

9 8 7 6 5 4 3 2 1 0   ——   arr[0] > arr[1],则需要交换两个元素

8 9 7 6 5 4 3 2 1 0   ——   arr[1] > arr[2],也需要交换

8 7 9 6 5 4 3 2 1 0

…………

8 7 6 5 4 3 2 1 0 9   ——   此时的元素9就到了最终应该出现的位置

以上的逻辑操作为一趟冒泡排序,一趟冒泡排序搞定了一个元素最终应该停留的位置上

那么10个元素就要进行9趟冒泡排序,因为10个元素中的9个元素都出现在自己该停留的位置上了,那么第10个元素也在自己该停留的位置上。由此可得,n个元素就要进行n-1趟冒泡排序

 每一趟冒泡排序的内容

  • 当第一个元素大于第二个元素时,就进行交换,否则就比较下一对,以此类推,比较完每一对元素后,至少会有一个元素停留再最终应该出现的位置
  • 当10个元素需要排序时,需要比较9对,当9个元素需要排序时,需要比较8对…………
  • 由此可见每趟冒泡排序的内容是随着元素逐渐递减的,所以可以通过冒泡排序的趟数来控制每趟冒泡排序的递减

插旗小技巧

可以在每一趟冒泡排序的代码内容中插旗,初始flag赋值为1

每当有元素进行交换,就将flag赋值为0

如果所有元素遍历完后都没有进行交换,那么说明此时的数组已经是升序状态,那么也没有将flag赋值为0

每次循环完后判断flag是否为1,为1时就停止排序,跳出循环


话不多说,上代码

#include<stdio.h>

void bubble_sort(int* str, int sz)
{
    //sz个元素,则进行sz-1趟冒泡排序
	for (int i = 0; i < sz - 1; i++)  
	{
		//插旗
		int flag = 1;
        
        //每当交换完一个元素时,交换趟数就应该递减,所以可以由i来控制
		for (int j = 0; j < sz - 1 - i; j++)  
		{
			if (*(str + j) > *(str + j + 1))  //判断每一对
			{
				//交换前,让flag失效
				flag = 0;

				//交换
				int tmp = *(str + j);
				*(str + j) = *(str + j + 1);
				*(str + j + 1) = tmp;
			}
		}
		//判断flag是否为真,为真则表明没有进入循环,
        //也就表明没有交换,同样也就表明此时的数组已经为升序
		if (flag)
			return ;

	}
}

int main()
{
	//创建数组
	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };

	//数组元素个数
	int sz = sizeof(arr) / sizeof(arr[0]);

	//冒泡排序
	bubble_sort(arr, sz);

	//打印验证
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}

	return 0;
}

see you 

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值