双向冒泡排序

点击查看代码
#include<algorithm>
using namespace std;

/*
函数功能:双向冒泡排序(有序排序)
函数列表:
a[]:待排序序列
n:待排序元素个数
*/
void BubbleSort(int a[], int n) {
	int left = 0, right = n - 1; //a[]的排序区间[left,right]
	bool flag = true; //记录本轮是否有元素交换位置,true表示有
	int i, j;
	//flag为true表示序列有元素交换,冒泡排序未结束
	while (flag) { 
		flag = false; //每轮开始时假设冒泡排序完成,然后再检查本轮是否有元素交换	
		//从左往右扫描,最大值放在右边
		for (i = left; i < right; i++) { 		
			if (a[i] > a[i + 1]) { //如果a[i]>a[i+1],则两者互换			
				swap(a[i], a[i + 1]);
				flag = true; //有元素交换时flag设为true,表示冒泡排序未结束
			}
		}
		right--;//扫描结束右边确定了1个元素最终位置,该元素不参与下一轮排序,右边界左移1位	
		//从右往左扫描,最小值放在左边
		for (j = right; j > left; j--) { 		
			if (a[j - 1] > a[j]) { //如果a[j-1]大于a[j],则两者互换			
				swap(a[j - 1], a[j]);
				flag = true;
			}
		}
		left++;//扫描结束左边确定了1个元素最终位置,该元素不参与下一轮排序,左边界右移1位
	}
}


posted @ 2022-09-26 22:05  zhaoo_o  阅读(6)  评论(0编辑  收藏  举报