详谈内部排序之冒泡排序

冒泡排序


交换排序:

​ 两两比较待排序记录的关键码,如果发生逆序(即排列顺序与排序后的次序正好相反),则交换之,直到所有记录都排好序为止 。

​ 交换排序的主要算法有:

​ (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]

冒泡排序算法分析:

正序:

​ 只需进行一趟排序,在排序过程中进行n-1次关键字间的比较,且不移动记录;时间复杂度为O(n) 。

逆序:

​ 需要进行n-1趟排序,需要进行n(n-1)/2次比较,并作等数量级的记录移动。总的时间复杂度为O(n^2) 。

​ 冒泡排序方法是稳定的,适合于数据较少的情况。


冒泡排序的性能分析:

时间效率:O(n^2)

空间效率: O(1)

算法的稳定性:稳定

你可能感兴趣的:(算法,数据结构,排序算法,verilog,冒泡排序)