主题:我发现了一种超级快的排序方法!!(估计是除了快排、计数排序之外最快的了)
这种排序方法既有快速排序的递归特性,又像二路归并排序。
排序的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]
排序的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]