冒泡排序&排序算法简介
根据排序过程中的主要操作,可以将内排序分为以下几种:
插入排序:直接插入排序,希尔排序(改进的直接插入排序)
交换排序:冒泡排序,快速排序(改进的冒泡排序)
选择排序:简单选择排序,堆排序(改进的简单选择排序)
归并排序:归并排序
本次主要介绍冒泡排序,接下来,将会陆续介绍以上各种排序算法,以代码加图示的方法来展示上述排序算法。
冒泡排序的基本思想:两两比较相邻记录的关键字,若反序则交换位置,直到没有反序的记录为止。
一. 冒泡排序
以顺序表L = {9,1,5,8,3}为例,length = 5。代码如下所示:
1 //冒泡排序法
2 //顺序表L中共有length个记录
3 void BubbleSort1(SqList* L)
4 {
5 int i, j;
6
7 //只需要循环(length-1)次,最后一次(i=length时)只剩下一个元素,一定为最大值
8 for (i = 1; i < L->length; i++)//循环结束后,第i个关键字为剩余待排元素的最小值
9 {
10 //j的初始值为length-1,因为比较时是对r[j]和r[j+1]进行比较
11 for (j = L->length - 1; j >= i; j--)//将剩下的(length-i)个记录进行比较
12 {
13 //从后往前两两比较相邻记录的关键字,若反序,则交换
14 if (L->r[j] > L->r[j + 1])//前者大于后者
15 swap(L, j, j + 1);
16 }
17 }
18 }
顺序表中的记录变化如下所示:
二. 冒泡排序优化
以顺序表L = {2,1,3,4,5}为例,length = 5。
对于该顺序表,当 i = 2 时,没有数据交换,此时,序列已经有序,若采用冒泡排序,则之后的循环判断都是无意义的,所以我们加入了标记变量 flag 对冒泡排序进行优化。
代码如下所示:
1 //冒泡排序优化
2 //当剩余数列已经有序时,则不需要在对后面的循环进行判断
3 //增加一个标记变量flag来实现
4 void BubbleSort2(SqList* L)
5 {
6 int i,j;
7 bool flag = true;
8
9 //flag为false则退出循环
10 //表明在剩余的序列中未进行元素位置的交换
11 for (i = 1; i < L->length && flag; i++)
12 {
13 flag = false;//初始值为false
14
15 for (j = L->length - 1; j >= i; j--)
16 {
17 if (L->r[j] > L->r[j + 1])
18 {
19 swap(L, j, j+1);
20 flag = true;//只要有一次数据交换,则flag为true
21 }
22 }
23 }
24 }
顺序表中的记录变化如下所示:
相关链接:
简单选择排序 https://www.cnblogs.com/yongjin-hou/p/13859148.html
直接插入排序 https://www.cnblogs.com/yongjin-hou/p/13861458.html
希尔排序 https://www.cnblogs.com/yongjin-hou/p/13866344.html
堆排序 https://www.cnblogs.com/yongjin-hou/p/13873770.html
归并排序 https://www.cnblogs.com/yongjin-hou/p/13921147.html
快速排序 https://www.cnblogs.com/yongjin-hou/p/13950379.html
参考书籍:程杰 著,《大话数据结构》,清华大学出版社。