一种双向交替折半插入排序的计算机内部排序方法与流程

文档序号:24177539发布日期:2021-03-09 10:41阅读:121来源:国知局
一种双向交替折半插入排序的计算机内部排序方法与流程

1.本发明涉及排序方法技术领域,具体为一种双向交替折半插入排序的计算机内部排序方法。


背景技术:

2.插入排序是计算机内部排序中最简单的排序算法之一。它的基本思想是把第一个元素当作初始有序序列,从第二个元素开始,逐个将所有元素向前插入到该序列之中。插入排序主要有两个基本操作,即查找插入位置时的数据比较和插入时的数据移动,通常把数据比较次数和数据移动次数作为算法的时间复杂度。根据查找插入位置的方式的不同,又分为直接插入排序和折半插入排序。折半插入排序也可以视为直接插入排序的改进算法,通过折半查找方式,减少了数据比较次数,但数据移动次数没有改变。2-路插入排序[1]是折半插入排序的改进算法,能够相对减少排序过程中数据的移动次数,但空间复杂度从o(1)增加到了o(n),时间复杂度受第一个元素影响。当第一个元素是最大或最小的元素时,算法的时间复杂度变得与折半插入排序一致。针对这些不足,本发明提出一种双向交替折半插入排序的计算机内部排序方法,用于解决上述问题。


技术实现要素:

[0003]
(一)解决的技术问题
[0004]
针对现有技术的不足,本发明提供了一种双向交替折半插入排序的计算机内部排序方法,具备降低排序次数等优点,解决了2-路插入排序效率受分界元素影响的问题。
[0005]
(二)技术方案
[0006]
为实现上述降低排序次数的目的,本发明提供如下技术方案:一种双向交替折半插入排序的计算机内部排序方法,包括以下步骤:
[0007]
s1:输入随机数列r[0

n-1];
[0008]
s2:对数列初始化,若r[0]>r[n-1]则r[0]与r[n-1]交换,左端有序序列指针left=0,右端有序序列指针right=n-1;
[0009]
s3:从右端向左扫描,若r[right-1]>r[right],则r[right-1]向右端插入,right
--
;若r[right-1]<r[right],则right
--
,比较r[right]与r[left],若r[right]<r[left],则r[right]向左端插入,然后r[right]=r[left];
[0010]
s4:从左端向右扫描,若r[left]>r[left+1],则r[left+1]向左端插入,left++;若r[left]<r[left+1],则left++,比较r[left]与r[right],若r[left]>r[right],则r[left]向右端插入,然后r[left]=r[right];
[0011]
s5:若left<right,重复step2、step3;
[0012]
s6:输出r[0

n-1],算法结束。
[0013]
优选的,所述双向交替折半插入排序算法的排序在原序列中进行,所述双向交替折半插入排序算法先在序列的左右两端按非递减排序后再逐渐向中间靠拢。
[0014]
优选的,所述步骤s3与步骤s4采取从右向左和从左向右交替扫描的方式,所述步骤s3与步骤s4分别将大的数据插入右部有序序列和将小的数据插入左部有序序列。
[0015]
优选的,所述步骤s3与步骤s4中保证左右两端的有序序列等长,所述步骤s3与步骤s4中排序最终在序列的中间点结束。
[0016]
优选的,所述双向交替折半插入排序算法排序过程中保证右端有序序列数据不小于左端有序序列数据。
[0017]
(三)有益效果
[0018]
与现有技术相比,本发明提供了一种双向交替折半插入排序的计算机内部排序方法,具备以下有益效果:
[0019]
该双向交替折半插入排序的计算机内部排序方法,通过排序在原序列中进行,可以不增加辅助空间,通过先在序列的左右两端按非递减排序,再逐渐向中间靠拢,同时保证右端有序序列的数据不小于左端有序序列的数据,可以有效减少数据移动次数,保证数据最终按非递减排列,通过在扫描待排序数据时,采取从右向左和从左向右双向交替扫描的方式,分别将大的数据插入右部有序序列和将小的数据插入左部有序序列,保证左右两端的有序序列等长,排序最终在序列的中间点结束,可以让大的数据尽早向右移,让小的数据尽早向左移,从而有效地减少了数据移动次数。同时保证两端的有序序列同步增长,排序在序列的中间点结束,有效地避免了2-路插入排序效率受分界元素影响的缺点,在对随机序列排序时,数据移动次数比折半插入排序降低了50%、比2-路插入排序降低了25%;在对正序序列排序时,数据比较次数为2n

3次,数据移动次数为0次,而2-路插入排序的数据比较次数为nlog2n次,移动数据为2n次;在对逆序数据排序时,相比2-路插入排序而言,数据比较次数降低了47.37%,数据移动次数降低了25%。
附图说明
[0020]
图1为本发明提出的一种双向交替折半插入排序的计算机内部排序方法的排序示例图;
[0021]
图2为本发明提出的一种双向交替折半插入排序的计算机内部排序方法与其他排序方法的随机序列数据移动次数对比图。
具体实施方式
[0022]
下面将结合本发明的实施例,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0023]
请参阅图1-2,一种双向交替折半插入排序的计算机内部排序方法,包括以下步骤:
[0024]
s1:输入随机数列r[0

n-1];
[0025]
s2:对数列初始化,若r[0]>r[n-1]则r[0]与r[n-1]交换,左端有序序列指针left=0,右端有序序列指针right=n-1;
[0026]
s3:从右端向左扫描,若r[right-1]>r[right],则r[right-1]向右端插入,
right
--
;若r[right-1]<r[right],则right
--
,比较r[right]与r[left],若r[right]<r[left],则r[right]向左端插入,然后r[right]=r[left];
[0027]
s4:从左端向右扫描,若r[left]>r[left+1],则r[left+1]向左端插入,left++;若r[left]<r[left+1],则left++,比较r[left]与r[right],若r[left]>r[right],则r[left]向右端插入,然后r[left]=r[right];
[0028]
s5:若left<right,重复step2、step3;
[0029]
s6:输出r[0

n-1],算法结束。
[0030]
双向交替折半插入排序算法的排序在原序列中进行,双向交替折半插入排序算法先在序列的左右两端按非递减排序后再逐渐向中间靠拢,从而有效减少数据移动次数,保证数据最终按非递减排列。
[0031]
步骤s3与步骤s4采取从右向左和从左向右交替扫描的方式,步骤s3与步骤s4分别将大的数据插入右部有序序列和将小的数据插入左部有序序列,保证右端有序序列的数据不小于左端有序序列的数据;可以让大的数据尽早向右移,让小的数据尽早向左移。
[0032]
步骤s3与步骤s4中保证左右两端的有序序列等长,步骤s3与步骤s4中排序最终在序列的中间点结束。
[0033]
双向交替折半插入排序算法排序过程中保证右端有序序列数据不小于左端有序序列数据,利用这一特性,可有效减少数据的比较和移动次数,在两端有序序列中插入元素时,采用折半插入法,以减少数据的比较次数,双向交替折半插入排序法数据比较次数如下表所示:
[0034][0035]
双向交替折半插入排序法数据移动次数如下表所示:
[0036][0037]
双向交替折半插入排序算法有效地避免了2-路插入排序效率受分界元素影响的缺点,在对随机序列排序时,数据移动次数比折半插入排序降低了50%、比2-路插入排序降低了25%;在对正序序列排序时,数据比较次数为2n

3次,数据移动次数为0次,而2-路插入排序的数据比较次数为nlog2n次,移动数据为2n次;在对逆序数据排序时,相比2-路插入排序而言,数据比较次数降低了47.37%,数据移动次数降低了25%,双向交替折半插入排序算法与其他算法对随机序列排序时数据比较次数对比数据如下表所示:
[0038][0039]
双向交替折半插入排序算法与其他算法对随机序列排序时数据移动次数对比如下表所示:
[0040][0041]
本发明方法的具体处理流程如下:
[0042]
1、初始化左右两端有序序列,比较r[0]与r[n-1],若r[0]>r[n-1],则交换r[0]与r[n-1],保证左端的初始有序序列不大于右端的初始有序序列;
[0043]
2、设置两个指针left与right,分别指向左端有序序列的最后一个元素和右端有序序列的第一个元素;
[0044]
3、初始时,left=0,right=n-1。首先,从右端向左端扫描,比较r[right-1]与r[right],若r[right-1]>r[right],则r[right-1]向右端插入,指针right减1;
[0045]
4、若r[right-1]<r[right],则指针right减1,此时,为保证指针right所指元素不小于left所指元素,则比较r[right]与r[left],若r[right]<r[left],则r[right]向左端插入,r[left]移动到right位置;
[0046]
5、接着,开始从左端向右端扫描,比较r[left]与r[left+1],若r[left]>r[left+1],则r[left+1]向左端插入,指针left加1;
[0047]
6、若r[left]<r[left+1],则指针left加1,此时,为保证指针left所指元素不大于指针right所指元素,则比较r[left]与r[right],若r[left]>r[right],则r[left]向右端插入,r[right]移动到left位置;
[0048]
7、此后,不断重复左右交替扫描,直到left=right,算法结束。
[0049]
本发明的有益效果是:通过排序在原序列中进行,可以不增加辅助空间,通过先在序列的左右两端按非递减排序,再逐渐向中间靠拢,同时保证右端有序序列的数据不小于左端有序序列的数据,可以有效减少数据移动次数,保证数据最终按非递减排列,通过在扫描待排序数据时,采取从右向左和从左向右双向交替扫描的方式,分别将大的数据插入右部有序序列和将小的数据插入左部有序序列,保证左右两端的有序序列等长,排序最终在序列的中间点结束,可以让大的数据尽早向右移,让小的数据尽早向左移,从而有效地减少
了数据移动次数。同时保证两端的有序序列同步增长,排序在序列的中间点结束,有效地避免了2-路插入排序效率受分界元素影响的缺点,在对随机序列排序时,数据移动次数比折半插入排序降低了50%、比2-路插入排序降低了25%;在对正序序列排序时,数据比较次数为2n

3次,数据移动次数为0次,而2-路插入排序的数据比较次数为nlog2n次,移动数据为2n次;在对逆序数据排序时,相比2-路插入排序而言,数据比较次数降低了47.37%,数据移动次数降低了25%。
[0050]
尽管已经示出和描述了本发明的实施例,对于本领域的普通技术人员而言,可以理解在不脱离本发明的原理和精神的情况下可以对这些实施例进行多种变化、修改、替换和变型,本发明的范围由所附权利要求及其等同物限定。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1