基本冒泡排序与算法改进

冒泡排序基本思想,相邻两数一次比较,按照要求顺序交换。
这里写图片描述

#include <stdio.h> 

void BubbleSort(int *Array,int n);
//*Array,待排数组;n,数组大小

int main()
{
	int Array[8]={5,9,2,16,7,4,12,15};
	int i;
	printf("待排序数组:\n");
	for(i=0;i<8;i++)
		printf("%d ",*(Array+i));
	BubbleSort(Array,8);
	printf("\n冒泡排序后的数组为:\n");
	for(i=0;i<8;i++)
		printf("%d ",*(Array+i));
}

//基本冒泡算法
void BubbleSort(int *Array,int n)
{
	int temp,i,j;
	for(i=n-1;i>0;i--)
		for(j=0;j<i;j++)
			if(*(Array+j)>*(Array+j+1))
			{
				temp= *(Array+j);
				*(Array+j) = *(Array+j+1);
				*(Array+j+1) = temp;
			}
} 

/*通过分析我们可以知道在每一趟冒泡比较之后,若发现从某个位置r开始,
不再进行记录交换,就说明Array[r+1]到Array[n-1]已经排好序,
因此下一趟比较只要进行到位置r就行。若某一趟扫描中没有记录交换,
这说明所有元素都已有序,算法可以结束,而不用进行n-1次扫描。
冒泡算法改进,用变量m记录数据最后一次交换位置记录数据最后一次交换位置*/
void BubbleSort(int *Array,int n)
{
	int bound=n;
	int m,i;
	int temp;
	while(bound!=0)
	{
		m=0;
		for(i=0;i<bound;i++)
		{
			if(*Array+i)>*(Array+i+1)
			{
				temp= *(Array+j);
				*(Array+j) = *(Array+j+1);
				*(Array+j+1) = temp;
				m=i;
			}
		}
		bound=m;
	}
}
			
/*以上都是单向排序,即大树均往下沉,经过一次比较可以
把最大数的记录送到最后的位置。其实我们可以在使大数往下
的同时让小数往上升,这样一次扫描就可以将最大的和最小的
记录放到最终位置上,这就是双向冒泡排序思想;
算法改进,双向排序,大数往下,小数往上*/
void BubbleSort(int *Array,int n)
{
	int boundmin=0;
	int boundmax=n;
	int min,max,i;
	int temp;
	while(boundmin<boundmax)
	{
		min=0;
		max=0;
		for(i=boundmin;i<boundmax;i++) //大数往下沉
		{
			if(*Array+i)>*(Array+i+1))
			{
				temp= *(Array+j);
				*(Array+j) = *(Array+j+1);
				*(Array+j+1) = temp;
				max=i;	//max记录下沉时候最后一次发生数据交换的位置
			}
		}
		if(max==0)	//本次扫描没有记录交换,扫描结束
			break;
		boundmax=max;
		for(i=boundmax-1;i>boundmin;i--)	//小数往上升
		{
			if(*(Array+i)<*(Array+i-1))
			{
				swap(*(Array+j),*(Array+j),temp);
				min=i;
			}
		}
		if(min==0)
			break;
		boundmin=min;
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值