回 帖 发 新 帖 刷新版面

主题:我发现了一种超级快的排序方法!!(估计是除了快排、计数排序之外最快的了)

这种排序方法既有快速排序的递归特性,又像二路归并排序。

排序的SUB接受一个数组。
如果该数组只有1个元素,则退出。
如果该数组只有2个元素,则如果第一个比第二个大,那么交换。退出。
如果该数组的元素数大于2个:
把它平均分成2组,对于每组再调用排序SUB。
然后用归并技术把它们合在一起。

程序:
DECLARE SUB sort (s!(), k!)
RANDOMIZE TIMER
CLS
INPUT m
tm = TIMER
DIM a(1 TO m): FOR i = 1 TO m: a(i) = INT(RND * 10000): NEXT i
CALL sort(a(), m)
FOR i = 1 TO m: PRINT a(i); : NEXT i: PRINT
PRINT TIMER - tm
END

SUB sort (s(), k)
IF k = 1 THEN EXIT SUB
IF k = 2 THEN
   IF s(1) > s(2) THEN SWAP s(1), s(2)
   EXIT SUB
END IF
t = INT(k * .5)
DIM p1(1 TO t), p2(1 TO k - t)
FOR i = 1 TO t: p1(i) = s(i): NEXT i
FOR i = t + 1 TO k: p2(i - t) = s(i): NEXT i
CALL sort(p1(), t)
CALL sort(p2(), k - t)
x = 1: y = 1: sss = 0
DO
  sss = sss + 1
  IF p1(x) < p2(y) THEN s(sss) = p1(x): x = x + 1 ELSE s(sss) = p2(y): y = y + 1
LOOP UNTIL x > t OR y > k - t
IF x > t THEN
   FOR i = y TO k - t: s(sss + 1 - y + i) = p2(i): NEXT i
ELSE
   FOR i = x TO t: s(sss + 1 - x + i) = p1(i): NEXT i
END IF
END SUB

该算法效率:
比快排稍微慢一点点。比如输入15000,则快排平均需要0.2秒,我的这个平均需要0.4秒。
所以我认为它的时间复杂度是O(2*m*LOG(2,m))

[b][color=FF0000]以后我再遇到排序之类的问题就全用它了。[/color][/b]

回复列表 (共1个回复)

沙发

1. 你了解过快速排序法的实际原理没有?
2. 你花了多少空间与递归知道吗?
3. 我不会算什么复杂度,但我也知道是怎么一回事.因为有的蠢事不只是你才会做得出来的.我也做过.

我来回复

您尚未登录,请登录后再回复。点此登录或注册