首页 > 其他分享 >C语言 跟着Mr.狠人一起实现冒泡排序

C语言 跟着Mr.狠人一起实现冒泡排序

时间:2024-09-03 12:25:43浏览次数:6  
标签:sort sz arr int 冒泡排序 C语言 ++ Mr bubble

冒泡排序(bubble sort)基本原理很简单,如图所示:

 这边方便大家快速观察顺序:

这边我们可以观察出冒泡排序是两两相比,每一趟都能确定最后一位成为本趟的最大值。 10个数字9趟就完成了。

那我们试着写写代码吧

void bubble_sort(int arr[], int sz)
{
	int i = 0;//趟数
	for (i = 0; i < sz-1; i++)//十个数字只用9趟
	{
		//每一趟里面的交换操作
		int j = 0;
		for (j = 0; j < sz-i-1; j++)//每趟都会固定一个数,所以不能写出j<sz-1
		{
			if (arr[j] > arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
}

int main()
{
	int arr[] = { 6,4,1,2,9,3,7,8,10,5 };
	int sz = sizeof(arr) / sizeof(arr[0]);

	bubble_sort(arr,sz);

	//打印出来看看结果
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

代码到这已经能非常完美的实现冒泡排序了,但有没有想过我们只需要排序这样一个数组:

{10,1,2,3,4,5,6,7,8,9} 

我们知道只需要将10放到最后一位,一趟就搞定了,但我们现在的代码还会将它循环9趟,那么如何提高我们的代码质量呢?

试想如果我们进入一趟内部,代码运行,但比较完一对都没有交换,是不是证明现在已经有序了。所以我们假设这个数组已经有序,但如果进入到交换数字的表达段落中,我们就把数组假设有序的开关关闭。

优化后代码:

void bubble_sort(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		int j = 0;
		int flag = 1;//假设数组有序
		for (j = 0; j < sz - i - 1; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
				flag = 0;//进行过交换数字,关闭开关
			}
		}
		if (flag == 1)//如果经历过判断,没进入交换,那么数组已经有序
		{
			break;
		}
	}
}

int main()
{
	int arr[] = { 6,4,1,2,9,3,7,8,10,5 };
	int sz = sizeof(arr) / sizeof(arr[0]);

	bubble_sort(arr, sz);

	//打印出来看看结果
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

这样一个简单的优化,我们的冒泡排序就很有含金量啦

将优化版本写成指针形式:

void bubble_sort(int* p, int sz)
{
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		int j = 0;
		int flag = 1;
		for (j = 0; j < sz - i - 1; j++)
		{
			if (*(p+j) > *(p+j+1))
			{
				int tmp = *(p+j);
				*(p + j) = *(p + j + 1);
				*(p + j + 1) = tmp;
				flag = 0;
			}
		}
		if (flag == 1)
		{
			break;
		}
	}
}

int main()
{
	int arr[] = { 6,4,1,2,9,3,7,8,10,5 };
	int sz = sizeof(arr) / sizeof(arr[0]);

	bubble_sort(arr, sz);

	//打印出来看看结果
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", *(arr+i));
	}
	return 0;
}

有帮助点个三连,还有优化方案评论区求分享

标签:sort,sz,arr,int,冒泡排序,C语言,++,Mr,bubble
From: https://blog.csdn.net/CPP_ZhouXuyang/article/details/141819472

相关文章

  • C语言 解开你对“二级指针”的心结与恐惧
    今天Mr.狠人在这和大家分享二级指针,我们不用把二级指针想的天花乱坠非常困难其实二级指针就是一个指针的地址。我们用代码来辅助理解一下intn=10;int*pn=&n;//pn是一个一级指针变量//pn指向n,指针变量也是一个变量现在我们有了n的地址,并且......
  • C语言指针的进阶理解——指针数组
    //整型数组 //顾名思义是存放整型类型的元素的数组 intarr1[]={1,2,3,4,5};//arr内元素的类型是int //字符数组 //顾名思义是存放字符类型元素的数组 chararr2[]={'a','b','c'};//arr内元素的类型是char那么指针数组你是不是也能推算出来它大概的模样了,差不......
  • 学习C语言之分支与循环(上)桀桀桀
     晚上好各位,桀桀桀。上面就是我们今天的内容了话不多说,开干。    <一>、if语句1.if语句的语法形式如下:if(表达式) 语句表达式成⽴(为真),则语句执⾏,表达式不成⽴(为假),则语句不执⾏。在C语⾔中,0为假,⾮0表⽰真,也就是表达式的结果如果是0,则语句不执⾏,表达式......
  • C语言程序设计(初识C语言后部分)
    世间风物论自由,喜一生我有,共四海丰收。12.表达式求值表达式求值的顺序一部分是由操作符的优先级和结合性决定。同样,有些表达式的操作符在求职过程中需要转换为其它类型。1)隐式类型转换C的整型算术运算总是至少以缺省(默认)整型类型的精度来进行的。为了获得这个精度,表达......
  • C语言程序设计-扫雷游戏
    愿你我成功会师,翻过雪山,走过草地,不远万里。扫雷游戏game.h#pragmaonce#include<stdio.h>#include<time.h>#include<stdlib.h>#defineROW9#defineCOL9#defineROWSROW+2#defineCOLSCOL+2#defineEASY_COUNT10voidInitBoard(charboard[ROWS][C......
  • C语言数字炸弹
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、游戏规则二、游戏制作1、游戏代码2、过程思考总结前言浅学了一点C语言,想试着做一个猜数字小游戏,类似于我们小时候玩过的“数字炸弹”。一、游戏规则随机生成一个1-100的数,玩家可......
  • C语言:大小端模式、判断大小端、大小端转换
    目录1.什么是大端和小端2.为什么会存在大小端的问题3.判断主机字节序(主机大小端)3.1使用联合体(union)3.2使用指针3.3强制转为char类型法4.大小端转换1.什么是大端和小端对于一个存储空间大于1个字节的数据,在内存中有两种存储模式,大端模式(big-end......
  • C语言_扫雷
    引言:当我们C语言学习完数组的时候,可以尝试一些小的游戏来提升自己,比如下面的这个扫雷。玩法介绍:我们需要在棋盘中选中地雷以外的安全区域,直到最后剩下全部的地雷为止,即可获胜。技能要求:分支语句以及循环语句、函数、数组。接下来我将创建三个文件:具备函数声明、宏定义、......
  • c语言编译器IDE的6键钢琴程序代码
    #include<stdio.h>#include<SDL2/SDL.h>#include<SDL2/SDL_mixer.h>//FunctionforloadingmusictoMix_MusicstaticMix_Music*loadMusic(constchar*path){Mix_Music*music=Mix_LoadMUS(path);if(music==NULL){fprintf(stderr,“M......
  • c语言编译器IDE小钢琴程序代码
    #include<stdio.h>#include<SDL2/SDL.h>#include<SDL2/SDL_mixer.h>//FunctionforloadingmusictoMix_MusicstaticMix_Music*loadMusic(constchar*path){Mix_Music*music=Mix_LoadMUS(path);if(music==NULL){fprintf(stderr,“M......