冒泡排序
交换排序:
两两比较待排序记录的关键码,如果发生逆序(即排列顺序与排序后的次序正好相反),则交换之,直到所有记录都排好序为止 。
交换排序的主要算法有:
(1) 冒泡排序
(2) 快速排序
冒泡排序基本思想:
小的浮起,大的沉底
具体做法:
第一趟:第1个与第2个比较,大则交换;第2个与第3个比较,大则交换,… 关键字最大的记录交换到最后一个位置上;
第二趟:对前n-1个记录进行同样的操作,关键字次大的记录交换到第n-1个位置上;
依次类推,则完成排序。
冒泡排序的过程:
例:关键字序列 T=(25,56,49,78,11,65,41,36)进行升序排序
请写出冒泡排序的具体实现过程。
初始状态 | 第一趟 | 第二趟 | 第三趟 | 第四趟 | 第五趟 | 第六趟 |
---|---|---|---|---|---|---|
25 | 25 | 25 | 25 | 11 | 11 | 11 |
56 | 49 | 49 | 11 | 25 | 25 | 25 |
49 | 56 | 11 | 49 | 41 | 36 | 36 |
78 | 11 | 56 | 41 | 36 | 41 | 41 |
11 | 65 | 41 | 36 | 49 | 49 | 49 |
65 | 41 | 36 | 56 | 56 | 56 | 56 |
41 | 36 | 65 | 65 | 65 | 65 | 65 |
36 | 78 | 78 | 78 | 78 | 78 | 78 |
如图所示: 加粗斜体的数字为,已经排序完成的数字。
具体步骤:
1) 第一趟中:
①首先比较(25 ,56),是小于关系,位置不变
结果为:25,56,49,78,11,65,41,36
②再次比较 (56,49),是大于关系,交换位置
结果为:25,49,56,78,11,65,41,36
③比较 (56,78),是小于关系,位置不变
结果为:25,49,56,78,11,65,41,36
④比较 (78,11),是大于关系,交换位置
结果为:25,49,56,11,78,65,41,36
⑤比较 (78,65),是大于关系,交换位置
结果为:25,49,56,11,65,78,41,36
⑥比较 (78,41),是大于关系,交换位置
结果为:25,49,56,11,65,41,78,36
⑦比较 (78,36),是大于关系,交换位置
结果为:25,49,56,11,65,41,36,78
到第⑦步之后,就结束了一次循环。
可以看到,每次循环结束后,我们的最后的一个数就是这一组数据中最大的数。
这样要注意的是,最后一个数,不需要在进行之后的操作,所以在循环结束一次后,将外层的循环减1。
然后进行下一次循环,重复以上步骤,直到排序完成后退出循环,完成排序
冒泡排序主要算法描述:
void Bubblesort(ElemType R[],int n) {
int flag=1; //当flag为0则停止排序
for (int i=n; i>1; i--) { //i表示趟数,最多n-1趟
flag=0; //开始时元素未交换
for (int j=2; j<=i; j++)
if (R[j]<R[j-1]) { //发生逆序
temp=R[j]; R[j]=R[j-1]; R[j-1]=temp;
flag=1;
}
if(flag==0) return;
}
} // Bubblesort
冒泡排序算法分析:
正序:
只需进行一趟排序,在排序过程中进行n-1次关键字间的比较,且不移动记录;时间复杂度为O(n) 。
逆序:
需要进行n-1趟排序,需要进行n(n-1)/2次比较,并作等数量级的记录移动。总的时间复杂度为O(n^2) 。
冒泡排序方法是稳定的,适合于数据较少的情况。
冒泡排序的性能分析:
时间效率:O(n^2)
空间效率: O(1)
算法的稳定性:稳定