Python归并排序和快速排序
首先来看归并排序,也称合并排序。具体操作参考维基百科。
参考代码如下:
def merg_sort(lst):
if(len(lst) <= 1): return lst
left = merg_sort(lst[:len(lst)/2])
right = merg_sort(lst[len(lst)/2:len(lst)])
result = []
while len(left) > 0 and len(right)> 0:
if( left[0] > right[0]):
result.append(right.pop(0))
else:
result.append(left.pop(0))
if(len(left)>0): result.extend(merg_sort(left))
else: result.extend(merg_sort(right))
return result
print merg_sort([8,7,43,2,5])
稍微有点罗嗦版,不过这样写最能体现整个操作过程:
def merge_sort(list2):
merge_sort_r(list2, 0, len(list2) -1)
# merge sort recursive (used by merge_sort)
def merge_sort_r(list2, first, last):
if first < last:
sred = (first + last)/2
merge_sort_r(list2, first, sred)
merge_sort_r(list2, sred + 1, last)
merge(list2, first, last, sred)
# merge (used by merge_sort_r)
def merge(list2, first, last, sred):
helper_list = []
i = first
j = sred + 1
while i <= sred and j <= last:
if list2 [i] <= list2 [j]:
helper_list.append(list2[i])
i += 1
else:
helper_list.append(list2 [j])
j += 1
while i <= sred:
helper_list.append(list2[i])
i +=1
while j <= last:
helper_list.append(list2[j])
j += 1
for k in range(0, last - first + 1):
list2[first + k] = helper_list [k]
接下来看看快速排序:同样具体操作参考wiki
import random def quickSort(lst): if(len(lst) <= 1):return lst greater = [] less = [] pivot = lst.pop(random.randint(0,len(lst)-1)) for item in lst: if(item < pivot): less.append(item) else: greater.append(item) return quickSort(less)+[pivot]+quickSort(greater) ary=[1,5,14,3,2,45,2,0,01,-1]
或者看个简洁版:
def qsort(L):
if not L: return []
return qsort([x for x in L[1:] if x< L[0]]) + L[0:1] + \
qsort([x for x in L[1:] if x>=L[0]])
写成一句话:
def quicksort(a): return a if len(a) <= 1 else quicksort([x for x in a[1:] if x <= a[0]]) + [a[0]] + quicksort([x for x in a[1:] if x > a[0]])
–EOF–
你可能还感兴趣的相关文章: |
不懂…有java的吗>
如此深奥~
Python没研究过这个东西
挺有意思的一门语言
博主,你写得这个快排和算法描述的不同吧,应该是原地排序的
没有错,我写的是快速排序
额,快速排序做原地排序,只需要一个额外的栈空间,最终输出的应该仍是原输入的数组,您这个算法对于低于和高于基准的两个子列使用了新的数组来存放。
恩,的确需要在速度和性能需要改进~ Thx
有时间再把它更改为原地分区版本