改写起泡排序算法:设一个整型变量change,指示每一趟排序中进行交换的最后一个记录的位置,并以它作为下一趟起泡排序循环终止的控制值。

void Swap(ElemType &A, ElemType &B);
Status GT(ElemType A, ElemType B);//>=
Status LT(ElemType A, ElemType B);//<=

//起泡排序  A[1....n]
//Swap,GT,LT函数根据实际情况编写并调用
void BubbleSort(ElemType A[], int n){
	for(int i = n; i > 1; i--){//n-1趟
		int flag = 0;
		for(int j = 1; j < i; j++){
			if(GT(A[j],A[j+1])){
				Swap(A[j], A[j-1]);
				flag = 1;
			}
		}
		if(!flag) break;
	}
}


//加上循环控制值change
void BubbleSort_change(ElemType A[], int n){
	for(int i = n; i > 1; i=change){
		int change = 1;//每一趟都要重新给change赋值,只要不满足change>1的初值都可 如change = -1,0,1...
		//int flag = 0;  //不再需要flag,这也是引入change的好处之一
		for(int j = 1; j < i; j++){
			if(GT(A[j],A[j+1])){
				Swap(A[j], A[j+1]);
				change = j;
			}
		}
	}
}

//写法2 A[0....n-1]
void BubbleSort_change(ElemType A[], int n){
		int change = n-1;
		while(change){//整体来看,change的值必然逐渐减小
			for(c = 0, i = 0; i < change; i++){//如果一次for下来没有发生交换,change = c = 0;while循环退出
				if(GT(A[i],A[i+1])){
					Swap(A[i], A[i+1]);
					c = i;//c指向此刻刚刚交换过的元素
				}
				change = c;//change指向最大的c,一趟结束才更新change
		}
			
		}
	}
}

严版数据结构的一道习题,算法参考了多个答案并进行了简单整理批注,比较全面,细节方面多个版本不太一致,但思路正确,考研可参考。 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值