比自己实现的快排快500多倍。。
import time
class Solution:
"""
@param: s: A string
@return: A string
"""
#自己实现的快排序
def median(self, nums):
# write your code here
mid = (len(nums)+1)/2-1
start = 0
end = len(nums)-1
index, nums = self.partition(nums, start, end)
while index!=mid:
if index>mid:
end = index-1
index, nums = self.partition(nums, start, end)
if index<mid:
start = index+1
index, nums = self.partition(nums, start, end)
return nums[mid]
def partition(self, nums, start, end):
key = nums[end]
s = start
e = end
while s<e:
while s<e and nums[s]<key:
s+=1
while s<e and nums[e]>=key:
e-=1
nums[s], nums[e] = nums[e], nums[s]
nums[e], nums[end] = key, nums[e]
return [s, nums]
#python自带的sort排序,timesort
#TimSort 算法为了减少对升序部分的回溯和对降序部分的性能倒退,将输入按其升序和降序特点进行了分区。排序的输入的单位不是一个个单独的数字,而是一个个的块-分区。其中每一个分区叫一个run。针对这些 run 序列,每次拿一个 run 出来按规则进行合并。每次合并会将两个 run合并成一个 run。合并的结果保存到栈中。合并直到消耗掉所有的 run,这时将栈上剩余的 run合并到只剩一个 run 为止。这时这个仅剩的 run 便是排好序的结果。
#综上述过程,Timsort算法的过程包括
#(0)如何数组长度小于某个值,直接用二分插入排序算法
#(1)找到各个run,并入栈
#(2)按规则合并run
def median2(self, nums):
# write your code here
mid = (len(nums)+1)/2-1
nums.sort()
return nums[mid]
if __name__ == '__main__':
sol=Solution()
ss = [1,2,3,4,5,6,6]*10000
s = time.time()
print sol.median(ss)
e = time.time()
print e-s
s = time.time()
print sol.median2(ss)
e = time.time()
print e-s
output:
4
1.64422798157
4
0.00263595581055
[Finished in 1.7s]