起泡排序(冒泡排序)
摘自书本:我们不难知道,在有序序列中每一对相邻元素都是顺序的,既对任意1 <= i <= n,都有A[i-1] <= A[i];反之,所有所有相邻元素均顺序的序列,也必然整体有序。
起泡排序思想:通过不断改变局部的有序性实现整体的有序,从前往后扫描每一对相邻元素,一旦发现有逆序随即交换二者元素的位置。对于长度为n的序列,共需要做n-1次比较和不超过n-1次交换,这一过程称作一趟扫描过程。而一趟扫描,整个序列并未达到整体有序,故需要进行多次扫描,交换直到在序列中不含有任何逆序的相邻元素。排序过程中,所有元素向各自的最终位置亦步亦趋的移动过程,犹如气泡在水中上下沉浮,因此称作起泡排序(bubblesort)。
算法原理(图解):
1.先从最后一个元素开始,与前一个相比较,若比前一个小,则交换位置(若比前一个大,则从倒数第二个元素继续,以此类推)。
2.交换后继续定位该元素,与前一个比较,直到比前一个大。
3.给原序列倒数第一个元素找好归宿后,再从后往前扫描方法同第1步。
算法实现(代码):
void bubblesort (int A[], int n) {
bool sorted = false;//整体排序标志,首先假定尚未排序
while(!sorted) {//在尚未完成全局排序前,逐趟进行扫描交换
sorted = true;//假定已经排好序
for(int i=n; i>=1; i--) {
if(A[i-1] > A[i]){
swap (A[i-1], A[i]);//交换扫描
sorted = false;//因整体排序不能保证,需要清除排序标志
}
}
n--;//至此末元素必然就位,故可以缩短排序序列的有效长度
}
}
//借助布尔类型的sorted,可及时提前退出,而不致总是蛮力地做n-1趟交换扫描
时间复杂度:O(n²)