数组、单链表冒泡排序——C语言实现

数组冒泡排序

冒泡排序的原理

从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。

举例

假如有一堆数据:
在这里插入图片描述

进行第一轮比较

第一次:80与31比较,80 > 31,交换
在这里插入图片描述

第二次:80与-4比较,80 > -4,交换
在这里插入图片描述

第三次:80与36比较,80 > 36,交换
在这里插入图片描述

第四次:80与-8比较,80 > -8,交换
在这里插入图片描述

此时,第一轮结束,最大值80已经到了最右边,一共进行了四次比较

第二轮比较 (下面就不添加图片了)

  • 第一次:31与-4比较,31 > -4,交换:-4 31 36 -8 80
  • 第二次:31与36比较,31 < 36,不交换: -4 31 36 -8 80
  • 第三次:36与-8比较,36 > -8, 交换:-4 31 -8 36 80
  • 80已经排序好,所以不用比较

经过第二轮,数据为
在这里插入图片描述

第三轮比较

  • 第一次:-4与31比较,-4 < 31,不交换:-4 31 -8 36 80
  • 第二次:31与-8比较,31 > -8,交换: -4 -8 31 36 80
  • 36、80已经排序好,所以不用比较

经过第三轮,数据为:
在这里插入图片描述

第四轮比较

  • 第一次:-4与-8比较,-4 > -8,交换:-8 -4 31 36 80

由上面四轮比较此数据已经排序完成,可以得出结论:假设一个数组长为n,则需要进行n-1轮比较,并且只有第一轮比较全部

代码如下

void Sort(int arr[],int size)
{
	int i,j;

	for (i=1;i<size;i++)
	{
		for (j=0;j<size-i;j++)
		{
			if (arr[j] > arr[j+1])
			{
				int temp = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = temp;
			}
		}
	//下面代码可以看到排序过程	
	/*	printf("\n");
		for (int i=0;i<size;i++)
			printf("%d ",arr[i]);
		printf("\n");
		printf("\n");
	*/
	}
}

size为数组的长度

单链表冒泡排序

假如有一个链表,数据如下:
在这里插入图片描述
但数组存储方式是连续的,容易操作,而链表存储方式非连续,所以操作起来会比较麻烦,下面我说一下我的思路

链表实现

t = Head_Node->next

第一轮
父循环从Head_Node->next->next开始,一直到不等于tail
在这里插入图片描述
子循环从t开始一直到t->next不等于tail

在这里插入图片描述此过程可以用t->datat->neaxt->data来进行两两相互比较,最后t会指向tail的前面,于是可以减小父循环与子循环tail = t

经过第一轮比较,最大值80移到到了最右端,并且减小了循环次数
在这里插入图片描述

第二轮
父循环从Head_Node->next->next开始,一直到不等于tail,也即执行了m-2次
在这里插入图片描述子循环从t开始一直到t->next不等于tail

在这里插入图片描述此过程可以用t->datat->neaxt->data来进行两两相互比较,最后t会指向tail的前面,于是可以减小父循环与子循环tail = t

经过第二轮比较,36移到到了右端,并减小循环次数

在这里插入图片描述

第三轮
父循环从Head_Node->next->next开始,一直到不等于tail
在这里插入图片描述子循环从t开始一直到t->next不等于tail
在这里插入图片描述此过程可以用t->datat->neaxt->data来进行两两相互比较,最后t会指向tail的前面,于是可以减小父循环与子循环tail = t

经过第三轮比较,31移到到了右端,并减小循环次数
在这里插入图片描述

第四轮

父循环从Head_Node->next->next开始,一直到不等于tail
在这里插入图片描述子循环从t开始一直到t->next不等于tail
在这里插入图片描述此过程可以用t->datat->neaxt->data来进行两两相互比较,最后t会指向tail的前面,于是可以减小父循环与子循环tail = t

经过第四轮比较,-4移到到了右端,并减小循环次数
在这里插入图片描述

至此,冒泡排序全过程已经结束,一共执行了四轮,同样满足:n个数据进行n-1轮比较。

代码如下

typedef struct Node
{
	int data;
	struct Node* next;
}LNODE,*LPNODE;
void Sort(LPNODE Head_Node)
{
	LPNODE r,t,tail;
	tail = NULL;

	while (Head_Node->next->next != tail)
	{
		r = Head_Node;
		t = Head_Node->next;

		while (t->next != tail)
		{
			if (t->data > t->next->data)
			{
				r->next = t->next;
				t->next = t->next->next;
				r->next->next = t;
				t = r->next;
			}
			r = r->next;
			t = t->next;
		}
		tail = t;
	}

}

写的不好的地方请指出来

  • 14
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

点灯大师~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值