冒泡排序&排序算法简介


根据排序过程中的主要操作,可以将内排序分为以下几种:

  插入排序:直接插入排序,希尔排序(改进的直接插入排序)

  交换排序:冒泡排序,快速排序(改进的冒泡排序)

  选择排序:简单选择排序,堆排序(改进的简单选择排序)

  归并排序:归并排序

本次主要介绍冒泡排序,接下来,将会陆续介绍以上各种排序算法,以代码加图示的方法来展示上述排序算法。

 

冒泡排序的基本思想:两两比较相邻记录的关键字,若反序则交换位置,直到没有反序的记录为止。

一. 冒泡排序

以顺序表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

 

参考书籍:程杰 著,《大话数据结构》,清华大学出版社。

posted @ 2020-10-22 15:22  封狼居胥!  阅读(803)  评论(2编辑  收藏  举报