咕嘟咕嘟——冒泡排序

目录

前言

一、冒泡排序概念

二、代码编写与使用

三、代码优化


前言

本章我们将学习一下C语言中的一种数据基础排序方法——冒泡排序,文章将从其概念、编写使用及代码优化三个方面为大家阐释,帮助大家理解与掌握

一、冒泡排序概念

对于冒泡排序我们该怎样理解这个名字呢,其实就像从水中冒出来的气泡一样,气泡往往会根据自身的体积大小不同,它从水中冒出来的速度也不同,大气泡先冒出,小气泡后冒出,类比于C语言中的元素,元素也会根据自身对应值的大小来进行排序,元素之间两两比较决定先后顺序的排序方法就叫做冒泡排序

二、代码编写与使用

首先我们梳理一下思路逻辑:给定一个数组,要我们对数组中的n个元素进行排序(以升序为例),我们将第一位和第二位元素进行比较,若元素1 > 元素2则二者交换位置,反之不变;再将第二位与第三位比较,以此类推...我们一共有n个元素,这一趟排序则需要进行(n-1)次两两比较,目的就是找出最大的元素并将其放到目标位置(即第n位)

 之后再进行下一趟排序,由于已经有一位元素移到目标位置,所以这趟排序只需要比较(n-1)个元素,即比较(n-2)次,以此类推,每趟排序都比前一趟少比较一次

由此我们可以得出以下代码:

void bubble_sort(int arr[], int sz)
	{
		int i = 0;
		//趟数
		for (i = 0; i < sz - 1; i++)
		{
			//一趟排序的过程
			int j = 0;
			for (j = 0; j < sz-1-i; j++)
			{
				if (arr[j] > arr[j + 1])
				{
					int tmp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = tmp;
				}
			}
		}
	}
	
	void print_arr(int arr[], int sz)
	{
		int i = 0;
		for (i = 0; i < sz; i++)
		{
			printf("%d ", arr[i]);
		}
	}
	
	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);
		//打印
		print_arr(arr, sz);
		return 0;
	}

三、代码优化

下面我们对上面所示的代码进行一下优化

可以知道当我们进行的某一次冒泡排序没有实现任何一次元素之间的交换的话,那就说明此时这几个对应元素已经都在对应的正确位置上了,因此这趟排序之后便不再需要进行下一次排序了,我们可以在原代码的基础上设定一个新变量k来控制排序不再进行

void bubble_sort(int arr[], int sz)
	{
		int i = 0;
		//趟数
		for (i = 0; i < sz - 1; i++)
		{
			//假设已经有序了
			int k = 1;
			//一趟排序的过程
			int j = 0;
			for (j = 0; j < sz-1-i; j++)
			{
				if (arr[j] > arr[j + 1])
				{
					int tmp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = tmp;
					k = 0;
				}
			}
			if (k == 1)
			{
				break;
			}
		}
	}
	
	void print_arr(int arr[], int sz)
	{
		int i = 0;
		for (i = 0; i < sz; i++)
		{
			printf("%d ", arr[i]);
		}
	}
	
	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);
		//打印
		print_arr(arr, sz);
		return 0;
	}


本章到这里就结束啦,希望各位小伙伴可以点个关注,支持一下阿鹿,大家的鼓励是我前进的第一动力,3Q~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值