冒泡排序深入具体解释

冒泡排序深入具体解释

大家好,又见面了,我是全栈君。

冒泡排序的基本思想

冒泡排序(Bubble Sort)是一种交换排序,它的基本思想是:两两比較相邻记录的keyword,假设凡需则交换。直到没有凡需的记录位置。

一、冒泡排序简单实现(0基础版)

#include "stdafx.h"

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

typedef int Status; 

#define MAXSIZE 10000  /* 用于要排序数组个数最大值。可依据须要改动 */
typedef struct
{
	int r[MAXSIZE+1];	/* 用于存储要排序数组,r[0]用作哨兵或暂时变量 */
	int length;			/* 用于记录顺序表的长度 */
}SqList;

void print(SqList L)
{
	int i;
	for(i=1;i<L.length;i++)
		printf("%d,",L.r[i]);
	printf("%d",L.r[i]);
	printf("\n");
}

/* 交换L中数组r的下标为i和j的值 */
void swap(SqList *L,int i,int j) 
{ 
	int temp=L->r[i]; 
	L->r[i]=L->r[j]; 
	L->r[j]=temp; 
}

/* 对顺序表L作交换排序(冒泡排序0基础版) */
void BubbleSort0(SqList *L)
{ 
	int i,j;
	for(i=1;i<L->length;i++)
	{
		for(j=i+1;j<=L->length;j++)
		{
			if(L->r[i]>L->r[j])
			{
				swap(L,i,j);/* 交换L->r[i]与L->r[j]的值 */
			}
		}
	}
}

#define  N 9
int _tmain(int argc, _TCHAR* argv[])
{
	int d[N]={9,1,5,8,3,7,4,6,2};
	SqList L0;
	int i;
	for(i=0;i<N;i++)
		L0.r[i+1]=d[i];
	L0.length=N;

	printf("排序前:\n");
	print(L0);

	BubbleSort0(&L0);
	printf("排序后:\n");
	print(L0);

	getchar();
	return 0;
}

执行结果:

冒泡排序深入具体解释

排序思想:依次实现前一个和后一个的比較,每次仅仅将最小的移至最高,其他元素位置差点儿不变。

冒泡排序深入具体解释

缺点:能够看出,在排好1和2的位置后,其余keyword的排序没有帮助(数字3反而还被换到了最后一位)。也就是说这个算法的效率是很低的。

二:正宗的冒泡排序

/* 对顺序表L作冒泡排序 */
void BubbleSort(SqList *L)
{ 
	int i,j;
	for(i=1;i<L->length;i++)
	{
		for(j=L->length-1;j>=i;j--)  /* 注意j是从后往前循环 */
		{
			if(L->r[j]>L->r[j+1]) /* 若前者大于后者(注意这里与上一算法的差异)*/
			{
				swap(L,j,j+1);/* 交换L->r[j]与L->r[j+1]的值 */
			}
		}
	}
}

冒泡排序深入具体解释
冒泡排序深入具体解释

代码分析:在不断循环的过程中,除了将keyword1放到第一的位置,我们还将keyword2从第九位置提到了第三的位置,显然这一算法比前面的要有进步,在上十万条数据的排序过程中,这样的差异会体现出来。

图中较小的数字如同气泡般慢慢浮到上面。因此就将此算法命名为冒泡算法。

长处总结:1)将最小keyword1提至最高; 2)将第一次比較过的keyword2放在合适的位置附近。

三:冒泡排序升级版

/* 对顺序表L作改进冒泡算法 */
void BubbleSort2(SqList *L)
{ 
	int i,j;
	Status flag=TRUE;			/* flag用来作为标记 */
	for(i=1;i<L->length && flag;i++) /* 若flag为true说明有过数据交换,否则停止循环 */
	{
		flag=FALSE;				/* 初始为False */
		for(j=L->length-1;j>=i;j--)
		{
			if(L->r[j]>L->r[j+1])
			{
				 swap(L,j,j+1);	/* 交换L->r[j]与L->r[j+1]的值 */
				 flag=TRUE;		/* 假设有数据交换。则flag为true */
			}
		}
	}
}


冒泡排序深入具体解释

除了第一和第二的keyword须要交换外。别的都已经是正常的顺序。当i=1时。交换了2和1,此时序列已经有序。可是算法仍然不依不饶地将i=2到9以及每一个循环中的循环都运行了一遍。虽然并没有交换数据,可是之后的大量比較还是大大地多余了。

长处:减去在排序k次后,表已经有序时,兴许的无需比較。

4、冒泡排序复杂度分析

分析它的时间复杂度。当最好的情况,也就是要排序的表本身就是有序的,依据最后改进的代码。进行n-1次的比較,间复杂度为o(n)。当最坏的情况,待排序表是逆序,此时须要比較总的次数为冒泡排序深入具体解释,并作等数级的记录移动。因此。总的时间复杂度为o(n2)。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116082.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux uvc协议_USB摄像头的UVC协议[通俗易懂]

    linux uvc协议_USB摄像头的UVC协议[通俗易懂]USB摄像头的UVC协议如今的主流操作系统(如WindowsXPSP2andlater,Linux2.4.6andlater,MacOS10.5andlater)都已提供UVC设备驱动,因此符合UVC规格的硬件设备在不需要安装任何的驱动程序下即可在主机中正常使用。使用UVC技术的包括摄像头、数码相机、类比影像转换器、电视棒及静态影像相机等设备。UVC是Microsoft与另…

    2022年10月26日
    0
  • sql Server配置管理器[通俗易懂]

    sql Server配置管理器[通俗易懂]一个是书里的,一个是我的,对比一下一:管理SQLServer2008服务开始—-所有程序—-MicrosoftSQLServer2008R2—-配置工具—-SQL Server配置管理器  …

    2022年7月21日
    9
  • SpringBoot线程池的创建、@Async配置步骤及注意事项

    SpringBoot线程池的创建、@Async配置步骤及注意事项前言:最近在做订单模块,用户购买服务类产品之后,需要进行预约,预约成功之后分别给商家和用户发送提醒短信。考虑发短信耗时的情况所以我想用异步的方法去执行,于是就在网上看见了Spring的@Async了。但是遇到了许多问题,使得@Async无效,也一直没有找到很好的文章去详细的说明@Async的正确及错误的使用方法及需要注意的地方,这里简单整理了一下遇见的问题,Sring是以配置文件的形式来开启…

    2022年6月24日
    31
  • 社区打造智慧小区_idc智能化解决方案

    社区打造智慧小区_idc智能化解决方案智慧社区建设方案丨智慧小区智能化解决方案随着物联网技术和我国新一代互联网技术的发展,未来社区网络将会实现全覆盖,通过社区网络和物联网络,将会实现社区机电设备和住宅的自动化,智能化,实现远程监控和网络数字化。智慧社区是社区综合服务管理的一种创新,利用前沿的智能化基础设施建设,增强社区治理和小区管理智能化,推动便民措施服务项目智能化,使社区居民的衣食住行更为舒服、高效率。智慧社区概念介绍:智慧社区是指充分利用物联网、云计算、移动互联网等新一代信息技术的集成应用,涉及到智能楼…

    2022年10月18日
    0
  • SpringBoot集成Quartz实现定时任务的动态创建、启动、暂停、恢复、删除。

    点击上方“全栈程序员社区”,星标公众号 重磅干货,第一时间送达 作者:毅大师 blog.csdn.net/qq_39648029/article/details/108993476…

    2021年6月26日
    88
  • 从单片机到ARM Linux驱动——Linux驱动入门篇

    从单片机到ARM Linux驱动——Linux驱动入门篇大一到大二这段时间里学习过单片机的相关知识,对单片机有一定的认识和了解。如果要深究其原理可能还差了一些火候。知道如何编写程序来点量一个LED灯,改一改官方提供的例程来实现一些功能做一些小东西,对IIC、SPI底层的通信协议有一定的了解,但是学着学着逐渐觉得单片机我也就只能改改代码了(当然有的代码也不一定能改出来)。对于我这种以后只想搬砖的码农来说已经差不多了(仅仅是个人观点),…

    2022年7月14日
    14

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号