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