开发工具与关键技术:Visual Studio 2015 直接插入排序与交换排序的比较
作者:廖 茂
撰写时间:2020年05月16日
在我们平时做项目中,总会碰到一些数据需要按照一定的规律进行排序,好比如从小到大排序或者从大到小排序,又或者其他等等一些规律进行排序,那么这要就需要用到一些数据的算法了;要实现数据的排序,算法又可能有多种,那么就要判断那种算法更合适了。在这里,我将对数据从小到大排序的多种算法中的直接插入排序和交换排序这两种算法进行比较。
首先我们来看一下直接插入排序,要对数据进行排序,那么就要先有数据,一个无序列表,然后还要有一个能够让数据进行排序的空有序表。开始时,有序表只包含一个元素,无序表中包含有n-1个元素,在排序过程中每次从无序表中取出第一个元素,将它插入有序表中的适当位置,使之成为一个新的有序表。每一趟都是将一个记录插入前面的有序段中,直到所有记录都插入到有序段中为止,总共需要进行n-1趟。首先我们们设一个有待排序的无序表(31,23,89,10,47,68,8),然后进行第一趟排序,如下:
如上图,R[0]作为起始监视哨,从无序表中获取第一个元素31来作为基准,然后再次从无序表中获取第一个元素23来与31进行比较,由于之前的第一个元素31已被取出,所以23就成了无序表中的第一个元素,比较后23比31小,那么23就直接插入排序到31的前面,然后23与自身相比相等,那么23就作为当前的对比基准。接下来的步骤如下:
从上图可以明确地看到依次从无序表中取出第一个元素来与有序段中的元素进行对比,从有序段的最右边的一个元素开始比较,如果比有序段中的最右边也就是最大的元素要小,就继续往左边的元素依次比较,直到比有序段中的某一个元素要大的时候再与自身相比较,在把自身作为比较基准,这样到最后自然而然地就完成了排序,总共需要排序的次数是n-1次。直接插入算法的元素移动是顺序的,该方法是稳定的,但一般适用于对排序元素较少、且基本有序的数据元素排序。
接下来看一下交换排序——快速排序,快速排序其基本思想是:从待排序序列的n个记录中任取一个记录Ri座位基准记录,以基准纪录为界限,将待排序序列划分成两个子序列,所有关键字小于Ki的记录移到Ri前面,所有关键字大于Ki的记录则移到Ri的后面,这个过程称作一趟快速排序;然后再用同样的方法对两个子序列排序,得到4个子序列;依次类推,直到每个子序列中只有一个记录为止,此时就得到n个记录的有序序列。那么下面我们假设一个无序列表,如下:
一般我们以第一个数据当做基准记录,需要有i和j两个指示器,其中i指向左边,它应该比基准记录要小,j所指向的数据应该比基准记录要大。如果i和j不满足上面要求,那么就要进行相应的处理,首先将控制权交给j,先把基准记录29备份,然后看到j所指向的值为16,比29要小,那么16应该放到i所指向的位置,然后i指示器往后移动i++,然后i指向7,7比29要小,那么i再往后移动,当i指向47,47比29要大,那么47应该放到j所指向的位置,控制权再次交回到j,然后j–,j往前移动,当j指向98,,98比29要大,那么j再次往前移动,依次类推,步骤如下:
最后第一趟的排序结果为(16,07,21)29(53,36,98,47).其余各趟排序直至最后排序结束结果如下:
这样快速排序就完成了,快速排序算法的时间效率取决于划分子序列的次数,对于有n个记录的序列进行划分,共需要n-1次关键字的比较,快速排序是一种不稳定的排序方法。
直接插入排序与快速排序两者之间,当所需排序的无序列表中的元素个数较少时,建议使用直接插入排序,反之推荐使用快速排序。