本文内容源于对《数据结构(C语言版)》(第2版)、王道讲解学习所得心得、笔记整理和总结。
交换排序的基本思想:两两比较待排序记录的关键字,一旦发现两个记录不满足次序要求时则进行交换,直到整个序列全部满足要求为止。
交换排序的主要两种方法:冒泡排序、快速排序
本文内容主要针对冒泡排序。
在本文最后的练习的中,以举例子说明该排序方法,配以图文,讲解详细(含408真题)。
本文“干货”较足,建议收藏。
可搭配以下链接一起学习:
【考研】数据结构考点——快速排序(重点,含408真题)_住在阳光的心里的博客-CSDN博客
【考研复习:数据结构】查找(不含代码篇)_住在阳光的心里的博客-CSDN博客
【考研】《数据结构》知识点总结.pdf_考研数据结构知识点总结背诵-其它文档类资源-CSDN文库
【考研】数据结构考点——直接选择排序_住在阳光的心里的博客-CSDN博客
前言
一、冒泡排序(Bubble Sort)的定义
二、算法步骤及代码
(一)算法步骤(此处是升序)
(二)算法代码
三、算法分析及特点
(一)算法分析
(二)算法特点
四、练习
是一种最简单的交换排序方法,它通过两两比较相邻记录的关键字,如果发生逆序,则进行交换,从而使关键字小的记录如气泡一般逐渐往上 “漂浮”(左移),或者使关键字大的记录如石块一样逐渐向下“坠落”(右移)。
1、设待排序的记录存放在数组 r[1..n] 中。
首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序( 即 L.r[1].key > L.r[2].key ),则交换两个记录。然后比较第二个记录和第三个记录的关键字。依次类推,直至第 n - 1 个记录和第 n 个记录的关键字进行过比较为止。
上述过程称作第一趟起泡排序,其结果使得关键字最大的记录被安置到最后一个记录的位置上。
2、然后进行第二趟起泡排序,对前 n - 1 个记录进行同样操作,其结果是使关键字次大的记录被安置到第 n - 1 个记录的位置上。
3、重复上述比较和交换过程,第 i 趟是从 L.r[1] 到 L.r[n-i+1] 依次比较相邻两个记录的关键字,在“逆序”时交换相邻记录,其结果是这 n - i + 1 个记录中关键字最大的记录被交换到第 n - i + 1 的位置上。直到在某一趟排序过程中 有进行过交换记录的操作,说明序列已全部达到排序要求,则完成排序。
//对顺序表 L 做冒泡排序
vold BubbleSort (SqList &L){
// flag 用来标记某趟排序是否发生交换
m = L.length - 1;
flag = 1;
while((m > 0) && (flag == 1)){
flag = 0; //flag置为0,如果本趟排序没有发生交换,则不会执行下趟摔序
for (j = 1; j <= m; j++){
if(L.r[j].key > L.r[j+1].key){
flag = 1; //flag 置为 1, 表示本趟排序发生了交换
//交换前后两个记录
t = L.r[j];
L.r[j] = L.r[j+1];
L.r[j+1] = t;
}
}
--m;
}
}
1、时间复杂度
最好情况(初始序列为正序):只需进行一趟排序, 在排序过程中进行 n - 1 次关键字间的比较,且不移动记录。
最坏情况(初始序列为逆序):需进行 n - 1 趟排序,总的关键字比较次数 KCN 和记录移动次数RMN (每次交换都要移动 3 次记录)分别为
所以,在平均情况下,冒泡排序关键字的比较次数和记录移动次数分别约为 和
,时间复杂度为
。
2、空间复杂度
冒泡排序只有在两个记录交换位置时需要一个辅助空间用做暂存记录,所以空间复杂度
为 。
1、稳定排序。
2、可用于链式存储结构。
3、移动记录次数较多,算法平均时间性能比直接插入排序差。当初始记录无序,n 较大时,
此算法不宜采用。
1、已知待排序记录的关键字序列为 {49, 38, 65, 97, 76, 13, 27, 49},请给出用冒泡排序法进行排序的过程。
解:如下图。
待排序的记录总共有 8 个,但算法在第六趟排序过程中没有进行过交换记录的操作,则完成
排序。 排序结果为 r[1..n] = {13, 27, 38, 49, 49, 65, 76, 97}。
2、对 n 个不同的关键字由小到大进行冒泡排序,在下列( B )情况下比较的次数最多。
A. 从小到大排列好的 B. 从大到小排列好的
C. 元素无序 D. 元素基本有序
3、 对 n 个不同的排序码进行冒泡排序,在元素无序的情况下比较的次数为__
__。
可以摘取第一题(元素无序)的部分分析图,比较次数在表格最右列。
第一趟排序,一共比较了 n - 1 次。
第二趟排序,一共比较了 n - 2 次。
……
最后一趟比较1次。
4、 对一组数据(2,12,16,88,5,10)进行排序,若前 3 趟排序结果如下( )
第一趟:2,12,16,5,10,88
第二趟:2,12,5,10,16,88
第三趟:2,5,10,12,16,88
则采用的排序方法可能是( A )
A. 冒泡排序 B. 希尔排序
C. 归并排序 D. 基数排序
解:冒泡排序方法,在每趟排序中,均可找到最大或者最小的元素。在本题中,可以每一趟排序中,找到最大元素。