排序算法总计(未完结)

北京的生活已经远去,新的生活即将开始,趁现在有空将学校学过的计算机基础知识复习一下,先看一下排序算法

排序篇

基本概念

排序是计算机程序设计中的一种重要操作。不论数值计算还是非数值计算问题都要广泛地用到排序运算,特别是在数据处理方面引用的更加广泛。它的功能是将一个数据元素的任意序列,重新排列成一个按指定官架子有序的序列。排序的目的是便于查找,提高计算机的工作效率。因此,学习和研究各种排序方法是计算机工作中的重要课题之一。

插入排序

基本思想:每次将一个待排序的记录,按其关键字的大小插入到前面已经排好序的有序序列中的适当位置上,直到全部记录插入完成为止。按照插入的方法不通可以分为好几种,其中:直接插入排序,折半插入排序,2-路插入排序和希尔排序。

直接插入排序

基本思想

将序列中的元素依次的插入到有序序列中,导致最终结果有序序列不断变长,直到取完最后一个无序序列中的元素

折半插入排序

利用折半查找来实现插入位置的定位,因为折半查找的效率比较高,因此可以减少排序过程中的比较次数。适用于待排序的记录数量较大的情况。

2-路插入排序

希尔排序

希尔排序方法又称为缩小增量排序,它也是一种插入排序方法,是对直接插入排序方法的改进。

基本思想

将整个待排序的记录序列划分成若干个子序列,然后分别对每个子序列进行直接插入排序,这样可以减少参与直接插入排序的数据量,如此反复,当经过几次分组排序后,记录的排序依据基本有序,这个时候在对所有的记录进行一次直接插入排序。

例如,假设有这样一组数[ 13 14 94 33 82 25 59 94 65 23 45 27 73 25 39 10 ],如果我们以步长为5开始进行排序,我们可以通过将这列表放在有5列的表中来更好地描述算法,这样他们就应该看起来是这样:

1
2
3
4
5
6
7
13 14 94 33 82

25 59 94 65 23

45 27 73 25 39

10

然后我们对每列进行排序:

1
2
3
4
5
6
7
10 14 73 25 23

13 27 94 33 39

25 59 94 65 82

45

將上述四行數字,依序接在一起时我们得到:[ 10 14 73 25 23 13 27 94 33 39 25 59 94 65 82 45 ].这时10已经移至正确位置了,然后再以3为步长进行排序:

1
2
3
4
5
6
7
8
9
10
11
10 14 73

25 23 13

27 94 33

39 25 59

94 65 82

45

排序之后变为:

1
2
3
4
5
6
7
8
9
10
11
10 14 13

25 23 33

27 25 59

39 65 73

45 94 82

94

最后以1步长进行排序(此时就是简单的插入排序了)。

选择排序

选择排序思想

每一趟从待排序的序列中选出关键字最小的记录,按顺序放在已排好序的子序列的最后,直到全部记录排序完毕。常用的选择排序方法有简单选择排序和堆排序。

简单选择排序

堆排序

交换排序

交换排序的基本思想是:两两比较待排序记录的关键字,若发现两个记录的次序为逆序时,交换其存储位置,直到没有逆序的记录位置。下面介绍两个比较常用的交换排序:冒泡排序和快速排序。

冒泡排序

冒泡排序的基本思想:

对所有相邻记录的关键字值进行比较,如果是逆序(r[i]>[i+1]),则交换其位置,进过多趟排序,最终使整个序列有序。

  • 就是不断的将一个元素向后移动,直到移动到这个值最后所因在的位置。这个过程有点像水中冒泡一样不断的向上扩大直到水泡变得它所能承受的最大体积然后爆裂。

快速排序

排序排序基本思想:

快排是对冒泡排序的一种改进,它通过一趟排序将待排序记录划分成两部分,是的其中一部分记录的关键字比另一部分记录的关键字小;然后再分别对这两部分记录进行这种划分,直到每个部分为空或只包含一个记录时,整个快速排序结束。

归并排序

归并排序是将两个或者两个以上的有序序列合成一个新的有序序列。

基数排序

多关键字排序

链式基数排序

排序的几种方法