寻高手帮忙采用折半算法,将一个数字加入到一组数字里面,然后重新进行排序 ( 积分: 16 )

  • 主题发起人 主题发起人 aacc_1980
  • 开始时间 开始时间
A

aacc_1980

Unregistered / Unconfirmed
GUEST, unregistred user!
各位朋友,假如有一组数字,1、11、15、17、21、23、29,然后用户随意给出一个整数,如:19,如果采用循环的方式来进行排序,虽然可以排列出以下结果:1、11、15、17、19、21、23、29,但如果该组数字多的话,速度可能会比较慢。但小弟想采用折半的思路来进行排序,即先将19与该组数字的中间数进行比较,如果19大于该组数字的中间数,那么就直接与剩下的数字的中间数进行比较,依次类推,但虽然有这样的思路,但具体的实现方法却不知道如何做,能否帮忙写一个简单的例子,谢谢!<br>这是自己用循环作的,测试通过,可以成功排序,但希望有高手能帮忙改进一下,用折半的方法来解决该问题,谢谢!!!<br><br>var<br>&nbsp;&nbsp;arr_str:&nbsp;array&nbsp;of&nbsp;integer;<br>&nbsp;&nbsp;arr_new:&nbsp;array&nbsp;of&nbsp;integer;<br>&nbsp;&nbsp;i,&nbsp;j,&nbsp;k,&nbsp;tmp:&nbsp;integer;<br>begin<br>&nbsp;&nbsp;tmp&nbsp;:=&nbsp;StrToInt(Trim(edit1.Text));<br>&nbsp;&nbsp;SetLength(arr_str,&nbsp;4);<br>&nbsp;&nbsp;SetLength(arr_new,&nbsp;5);<br>&nbsp;&nbsp;j&nbsp;:=&nbsp;0;<br>&nbsp;&nbsp;arr_str[0]&nbsp;:=&nbsp;1;<br>&nbsp;&nbsp;arr_str[1]&nbsp;:=&nbsp;5;<br>&nbsp;&nbsp;arr_str[2]&nbsp;:=&nbsp;8;<br>&nbsp;&nbsp;arr_str[3]&nbsp;:=&nbsp;11;<br>&nbsp;&nbsp;for&nbsp;i&nbsp;:=&nbsp;low(arr_str)&nbsp;to&nbsp;high(arr_str)&nbsp;do<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;tmp&nbsp;&nbsp;&gt;&nbsp;arr_str&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arr_new&nbsp;:=&nbsp;arr_str<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arr_new&nbsp;:=&nbsp;tmp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j&nbsp;:=&nbsp;1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;k&nbsp;:=&nbsp;i&nbsp;+&nbsp;1;<br>&nbsp;&nbsp;if&nbsp;j&nbsp;=&nbsp;1&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;j&nbsp;:=&nbsp;k&nbsp;to&nbsp;high(arr_str)&nbsp;+&nbsp;1&nbsp;do<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arr_new[j]&nbsp;:=&nbsp;arr_str;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;:=&nbsp;i&nbsp;+&nbsp;1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;end<br>&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arr_new[high(arr_str)&nbsp;+&nbsp;1]&nbsp;:=&nbsp;tmp;<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;for&nbsp;i&nbsp;:=&nbsp;low(arr_new)&nbsp;to&nbsp;high(arr_new)&nbsp;do<br>&nbsp;&nbsp;&nbsp;&nbsp;ShowMessage(IntToStr(arr_new));<br>end;
 
这些排序方法一般都是递归调用的,你往这个方向想想。
 
http://www.1zwwz.cn/show.php?mod=article&amp;id=1886<br>这个TIntList组件查找、排序就是使用的折半查找,快!
 
测试过楼上介绍的,果然够快!<br>1W条以内,排序几乎不用时间,10W条记录,平均用时53.71ns!
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
763
import
I
I
回复
0
查看
843
import
I
后退
顶部