[C/C++]C语言实现简单的冒泡算法

用C语言实现对整形数组的冒泡排序

冒泡排序:比较两个相邻的元素,将值大的元素交换到右边。

思       路:  遍历数组,对数组中相邻的两个元素进行比较,如果需要升序,前一个数据大于后一个数据时,交换两个位置上的数据。

数组中n个元素,最多进行n - 1次排序 ,每次进行 n - 1 - i次交换,i为当前排序的次数。

按照这一思路得到如下代码:

void BubbleSort(int arr1[] , int Array_length1)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < Array_length1 - 1 ; i++ )   //n个元素,最多进行n - 1次排序 
	{
		int mark = 0;
		for (j = 0; j < Array_length1 - 1 - i; j++) //n个元素,每次进行 n - 1 - i次交换
		{
			int temp = 0;						
			if (arr1[j] > arr1[j + 1])
			{
				temp = arr1[j];
				arr1[j] = arr1[j + 1];
				arr1[j + 1] = temp;
			}
		}
	}

我们可以看到如果某次冒泡结束后,序列已经有序了,仍会进行剩余排序,而此时后面剩余元素的冒泡可以省略。

我们此时可以引入一个标记位,初始化为0,如出现交换,标记为1.代码如下

void BubbleSort(int arr1[] , int Array_length1)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < Array_length1 - 1 ; i++ )   //n个元素,最多进行n - 1次排序 
	{
		int mark = 0;
		for (j = 0; j < Array_length1 - 1 - i; j++) //n个元素,每次进行 n - 1 - i次交换
		{
			int temp = 0;						
			if (arr1[j] > arr1[j + 1])
			{
				temp = arr1[j];
				arr1[j] = arr1[j + 1];
				arr1[j + 1] = temp;
				mark = 1;		// 如果进行数据交换了,说明本次是无序的,就将mark设置为1
			}
		}
		if (!mark)	//取非
			return;	 // 元素没有交换,则本次开始冒泡时,数据已经有序了
	}
}

完整示例代码如下:

#include<stdio.h>

//整数类型 冒泡排序:比较两个相邻的元素,将值大的元素交换到右边。
void BubbleSort(int arr1[] , int Array_length1)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < Array_length1 - 1 ; i++ )   //n个元素,最多进行n - 1次排序 
	{
		int mark = 0;
		for (j = 0; j < Array_length1 - 1 - i; j++) //n个元素,每次进行 n - 1 - i次交换
		{
			int temp = 0;						
			if (arr1[j] > arr1[j + 1])
			{
				temp = arr1[j];
				arr1[j] = arr1[j + 1];
				arr1[j + 1] = temp;
				mark = 1;		// 如果进行数据交换了,说明本次是无序的,就将mark设置为1
			}
		}
		if (!mark)	//取非
			return;	 // 元素没有交换,则本次开始冒泡时,数据已经有序了
	}
}
void Show(int arr2[], int Array_length2)
{
	int z = 0;
	for (z = 0; z < Array_length2; z++)
	{
		printf("%d ", arr2[z]);
	}
	printf("\n");
}
int main()
{
	int arr[10] = { 10 , 1 , 35 , 30 , 40 , 44 , 56 , 97 , 68 , 82 };
	int Array_length = sizeof(arr) / sizeof(arr[0]);   //数组元素个数
	Show(arr, Array_length);
	BubbleSort(arr, Array_length);
	Show(arr,Array_length);
	return 0;
}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值