排序算法,顾名思义,就是将毫无规则的多个数据项序列,重新排列成一个有序序列的算法。比较常用的排序算法有交换类排序、选择类排序和插入类排序。
1.交换类排序
交换排序的实质是通过多次相邻两数据项的交换,最终达到排序的目的。我们介绍两个比较简单的交换类排序算法:冒泡排序和快速排序。
(1)冒泡排序
算法详细描述如下:
- 假设有一组无序数据项排列,其数据项总共有n个,首先将第一个位置的数据项(记为a1)和第二个位置的数据项(记为a2)进行比较,如果a1>a2,则将a1和a2交换位置。然后在将第二位置的数据项和第三位置的数据进行比较,依次类推,直到第n-1的数据项和第n位置的数据项进行比较。
- 重复第一步骤(重新从第一位置开始,比较第一位和第二位置的数据项,一直比较到第n位置的数据项),直到所有的数据项都已是按顺序排列为止。
我们举例阐述如下:
图2.2.38 冒泡排序示例
算法性能分析:
在最好的情况下,即原始序列已经是有序序列,则对长度为n的线性表,冒泡排序算法只需比较n-1次,其时间复杂度为O(n)。
在最坏的情况下,即原始序列是逆序排列,则对长度为n的线性表,冒泡排序算法需要比较的次数为n(n-1)/2,其时间复杂度为O(n2)。
(2)快速排序
快速排序是在冒泡排序的基础上进行了优化,其算法详细描述如下:
- 假设有一组无序数据项排列,其数据项总共有n个。我们从中取一个数据项K(通常的做法是取第一个位置上的数据项),然后以K为标准,把大于K的数据项都移动K的后面,把小于K的数据项都移到K的前面。这样以K为分界线,将数据项排列分成了两组。
- 对产生的两组数据项排列重复步骤1的过程,进行分组,直到每个分组里面只有一个数据项为止。此时整个数据项排列就是有序的了。
我们举例阐述如下: