冒泡排序算法

基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序为止。

       对于有n个元素的序列,最坏情况是要冒n-1趟,每趟选出一个最大的元素放在序列的末尾, 或最小的元素放在序列的头部,剩下的元素再次冒泡。 

#include <stdio.h>

void swarp(int array1[], int i, int j)
{
	int temp = array1[i];
	array1[i] = array1[j];
	array1[j] = temp;
}


//每次找出最大的一个元素放在后面排列
void bubblesort(int array1[], int length)
{
	int i = 0;
	int j = 0;
	int exchanged = 1;  //优化代码,当不在发生交换时,说明整个序列已经是按顺序排列了,不需要再继续了

	for(i=0; i < length && exchanged; i++)
	{
		for(j=1; j < length-i; j++)
		{
			if(array1[j-1] > array1[j])
			{
				swarp(array1, j-1, j);
			}
		}
	}
}


//每次找出最小的一个元素放在前面排列
void bubblesort1(int array1[], int length)
{
	int i = 0;
	int j = 0;
	int exchanged = 1;

	for(i=0; i < length && exchanged; i++)
	{
		exchanged = 0;

		for(j= length-1; j > i; j--)
		{
			if(array1[j] < array1[j-1])
			{
				exchanged = 1;
				swarp(array1, j, j-1);
			}
		}

	}

	printf("i = %d\n", i);
}

int main()
{
	int i = 0;
	int array1[] = {1, 2, 3, 4, 5};
	int length = sizeof(array1) / sizeof(array1[0]);

	bubblesort1(array1, length);

	for(i=0; i < length; i++)
	{
		printf("%d\n", array1[i]);
	}

	return 0;
}


 

        这是实现了两中冒泡方式,一种是每次冒泡选出最大的元素(下沉),一种是每次冒泡是选出最小的元素(上浮),后者语义更符合冒泡的含义。

        这里进行了优化,使用变量exchanged记录每趟冒泡是否有交换,如果某趟没有发生交换,则说明序列已经排好序了,没有必要再进行下去了,否则每次都要执行n-1趟。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值