冒泡排序及其改进算法C语言实现

本文介绍了冒泡排序的基本原理,并通过C语言实现了冒泡排序、改进的冒泡排序、进一步改进的冒泡排序以及双向冒泡排序。在改进的排序算法中,通过设置标志位来优化了冒泡过程,提高了排序效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdio.h>
#include <stdlib.h>

//冒泡排序
void BubbleSort(int *array,int n)
{
	int temp;
	for (int i=n-1;i>0;i--)
	{
		for (int j=0;j<i;j++)
		{
			if (*(array+j)>*(array+j+1))
			{
				temp=*(array+j);
				*(array+j)=*(array+j+1);
				*(array+j+1)=temp;
			}
		}
	}
}
//改进的冒泡排序,在一次冒泡的过程中,如果没有发生交换,则已经有序
void ImprovedBubbleSort(int *array,int n)
{
	int flag,temp;
	for (int i=n-1;i>0;i--)
	{
		flag=0;//每次冒泡前将flag置0
		for (int j=0;j<i;j++)
		{
			if (*(array+j)>*(array+j+1))
			{
				temp=*(array+j);
				*(array+j)=*(array+j+1);
				*(array+j+1)=temp;
				flag=1;//只要发生了一次交换,flag置1
			}
		}
		//在一次冒泡过程后,flag依然为0,表示未发生交换,则排序结束
		if (0==flag)
		{
			break;
		}
	}
}

//进一步改进的冒泡排序,如果在某次冒泡过程中,最后一次进行交换的位置为flag,则
//表示flag之后的序列已经有序,那么下一次冒泡就无需比较flag之后的序列,即只要比
//较到flag就可以结束此次冒泡过程。当flag=0时,表示某趟冒泡没有发生交换,即可结束。
void BetterBubbleSort(int *array,int n)
{
	int temp,flag,bound=n-1;//bound记录每趟冒泡的边界
	while (bound!=0)
	{
		flag=0;//flag初始置为0,一趟冒泡后如果flag仍然为0,则已经有序,排序结束
		for (int j=0;j<bound;j++)
		{
			if (*(array+j)>*(array+j+1))
			{
				temp=*(array+j);
				*(array+j)=*(array+j+1);
				*(array+j+1)=temp;
				flag=j;//flag用于记录一次冒泡过程中最后一次交换的位置
			}
		}
		bound=flag;
	}
}

//双向冒泡排序,一次冒泡的过程中,分别将最大的记录和最小的记录都放到最终的位置
void DoubleBubbleSort(int *array,int n)
{
	int temp,j;
	int maxFlag,minFlag;//分别作为双向冒泡的标志
	int maxBound=n-1,minBound=0;//分别记录最大和最小的边界
	while (maxBound>minBound)
	{
		//初始将标志位置为0,某次交换过程后标志位依然为0,则排序结束
		maxFlag=0;
		minFlag=0;
		//此次交换将最大值下沉
		for (j=minBound;j<maxBound;j++)
		{
			if (*(array+j)>*(array+j+1))
			{
				temp=*(array+j);
				*(array+j)=*(array+j+1);
				*(array+j+1)=temp;
				maxFlag=j;//记录下沉过程中最后一次交换的位置
			}
		}
		//下沉的过程没有发生交换,排序结束
		if (0==maxFlag)
		{
			break;
		}
		//下沉过程结束后,重新设置下边界(最大有序边界)
		maxBound=maxFlag;
		//此次交换将最小值上浮
		for (j=maxBound;j>minBound;j--)
		{
			if (*(array+j)<*(array+j-1))
			{
				temp=*(array+j);
				*(array+j)=*(array+j-1);
				*(array+j-1)=temp;
				minFlag=j;//记录上浮过程中最后一次交换的位置
			}
		}
		//上浮的过程没有发生交换,排序结束
		if (0==minFlag)
		{
			break;
		}
		//上浮过程结束后,重新设置上边界(最小有序边界)
		minBound=minFlag;
	}
}


int main(int argc, char* argv[])
{
	int array[8]={5,9,2,16,7,4,12,15};
	int i;
	printf("Before Sort: ");
	for (i=0;i<8;i++) 
	{
		printf("%2d ",array[i]);
	}

	//BubbleSort(array,8);
	//ImprovedBubbleSort(array,8);
	//BetterBubbleSort(array,8);
	DoubleBubbleSort(array,8);

	printf("\n After Sort: ");
	for (i=0;i<8;i++) 
	{
		printf("%2d ",array[i]);
	}
	printf("\n");
	return 0;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值