排序算法描述之插入排序、希尔排序、快速排序、链式基数排序、二

2021-09-24 10:59

排序算法描述之插入排序、希尔排序、快速排序、链式基数排序、二路归并排序、堆排序

排序算法描述之插入排序、希尔排序、快速排序、链式基数排序、二路归并排序、堆排序。 2010-02-13 18:31

1、插入排序的基本方法是:

每步将一个待排序的对象,按其关键码大小,插入到前面已经排好序的一组对象的适当位置上,直到对象全部插入为止。

(1)直接插入排序 (Insert Sort)

直接插入排序的基本思想是:

当插入第i (i≥ 1) 个对象时,前面的V[0], V[1], …, v[i-1]已经排好序。这时,用v[i]的关键码与v[i-1], v[i-2], …的关键码顺序进行比较,找到插入位置即将v[i]插入,原来位置上的对象向后顺移。

(2) 折半插入排序 (Binary Insert Sort)

折半插入排序的基本思想是:

设在顺序表中有一个对象序列V[0], V[1], …, v[n-1]。其中,v[0], V[1], …, v[i-1]是已经排好序的对象。在插入v[i]时,利用折半查找法寻找v[i]的插入位置。

(3)链表插入排序

1.链表插入排序的基本思想是:在每个对象的结点中增加一个链接指针数据成员 link。

2.对于存放于数组中的一组对象V[1], V[2], …, v[n],若v[1], V[2], …, v[i-1]已经通过指针link,按其关键码的大小,从小到大链接起来,现在要插入v[i], i = 2, 3, …, n,则必须在前面i-1个链接起来的对象当中,循链顺序检测比较,找到v[i]应插入(或链入)的位置,把v[i]插入,并修改相应的链接指针。这样就可得到v[1], V[2], …, v[i]的一个通过链接指针排列好的链表。

3.如此重复执行,直到把v[n]也插入到链表中排好序为止。

(4)(缩小增量法)

属于插入类排序,是将整个无序列分割成若干小的子序列分别进行插入排序。

排序过程:先取一个正整数d1<n,把所有序号相隔d1的数组元素放一组,组内进行直接插入排序;然后取d2<d1,重复上述分组和排序操作;直至di=1,即所有记录放进一个组中排序为止。

初始:d=5

49 38 65 97 76 13 27 49* 55 04

|----------------------------|

38 27

|---------------------------|

65 49*

|----------------------------|

97 55

|--------------------------|

76 04

|-----------------------------|

一趟结果

13 27 49 55 04 49 38 65 97 76

d=3

13 27 49 55 04 49 38 65 97 76

排序算法描述之插入排序、希尔排序、快速排序、链式基数排序、二路归并排序、堆排序

|---------------|----------------|--------------------|

27 04 65

|----------------|----------------|

49 49 97

|----------------|-----------------|

二趟结果

13 04 49 38 27 49 66 65 97 76

d=1

13 04 49 38 27 49 66 65 97 76

|-----|-----|-----|-----|-----|-----|-----|-----|-----|

三趟结果

04 13 27 38 49 49 55 65 76 97

依照参考资料上的说法:“由于复杂的数学原因避免使用2的幂次步长,它能降低算法效率。”另外算法的复杂度为n的1.2次幂。因为非常复杂的原因(我也不知道过程),所以就不写了。

2、快速排序

快速排序是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按这种方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此使整个数据变成有序序列。

假设要排序的数组是A[1]……A[N],首先任意选取一个数据(通常选用第一个数据)作为关键数据(也称基准元素),然后将所有比它的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。一趟快速排序的算法是:

1)设置两个变量I、J,排序开始的时候I:=1,J:=N;

2)以第一个数组元素作为关键数据,赋值给X,即X:=A[1];

3)从J开始向前搜索,即由后开始向前搜索(J:=J-1),找到第一个小于X的值,两者交换;

4)从I开始向后搜索,即由前开始向后搜索(I:=I+1),找到第一个大于X的值,两者交换;

5)重复第3、4步,直到I=J;

例如:待排序的数组A的值分别是:(初始关键数据X:=49)

A[1] A[2] A[3] A[4] A[5] A[6] A[7]:

49 38 65 97 76 13 27

-|------------------------------------------------------|-

I(基准数据) J

进行第一次交换后: 27 38 65 97 76 13 49

排序算法描述之插入排序、希尔排序、快速排序、链式基数排序、二路归并排序、堆排序

-|------------------------------------------------------|-

I J

进行第二次交换后: 27 38 49 97 76 13 65

-|------------------------------------|-

I J

进行第三次交换后: 27 38 13 97 76 49 65

-|--------------------------|-

I J

( 按照算法的第五步将又一次执行算法的第三步从后开始找

进行第四次交换后: 27 38 13 49 76 97 65

( 按照算法的第四步从前面开始找大于X的值,97>49,两者交换,此时J:=4 )

此时再执行第三不的时候就发现I=J,从而结束一躺快速排序,那么经过一躺快速排序之后的结果是: 27 38 13 49 76 97 65,即所以大于49的数全部在49的后面,所以小于49 的数全部在49的前面。

快速排序就是递归调用此过程——在以49为中点分割这个数据序列,分别对前面一部分和后面一部分进行类似的快速排序,从而完成全部数据序列的快速排序,最后把此数据序列变成一个有序的序列。

4、链式基数排序

链式基数排序是借助“分配”和“收集”两种操作对单逻辑关键字进行排序的一种内部排序方法。有的逻辑关键字可以看成是由若干个关键字复合而成。

5、二路归并排序

合并排序(MERGE SORT)是又一类不同的排序方法,合并的含义就是将两个或两个以上的有序数据序列合并成一个新的有序数据序列,因此它又叫归并算法。它的基本思想就是假设数组A有N个元素,那么可以看成数组A是又N个有序的子序列组成,每个子序列的长度为1,然后再两两合并,得到了一个 N/2 个长度为2或1的有序子序列,再两两合并,如此重复,值得得到一个长度为N的有序数据序列为止,这种排序方法称为2—路合并排序。

排序算法描述之插入排序、希尔排序、快速排序、链式基数排序、二.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:关于兴业银行绿色信贷业务发展SWOT分析

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: