先放张结论:borrow from 排序算法-八大排序实现和性能比较

- 快速排序
i,j是两个位置标记,分别从左和右端向中间逼近
先选定list中一个数为base,j从后往前找,如果发现比base小,则将base替换成这个数,i开始往后找比base大的数,如果有,替换掉j处的数字,直至ij两者相遇,此时放回base到i的位置。这个过程将比base小的数都移到了左边,比base大的数都移到了右边。然后对左右两个区间分别用递归做上述过程即可。
myList = [49,38,65,97,76,13,27,49]
start = 0
end = len(myList)-1
def quicksort(myList, start, end):
if start > end:
return 'error'
else:
i = start
j = end
base = myList[i]
while(i<j):
while (i<j) and myList[j] >= base:
j = j - 1
myList[i] = myList[j]
while(i<j) and myList[i] <= base:
i = i + 1
myList[j] = myList[i]
myList[i] = base
quicksort(myList,start,i-1)
quicksort(myList,i+1,end)
return myList
print(quicksort(myList,start,end))
例子:
初始 [49,38,65,97,76,13,27,49] (49为base)
1 [27,38,65,97,76,13,27,49]
2 [27,38,65,97,76,13,65,49]
3 [27,38,13,97,76,13,65,49]
4 [27,38,13,97,76,97,65,49]
4 [27,38,13,49,76,97,65,49]
完成一次比较,对左右区间重复该过程
- 归并排序
归并的思想是假设左右分区已经是有序的了,用merge来合为一个有序列表,其实就是用两个指针标记两个分区元素的位置,比较哪个小就塞入新列表,这个分区的指针位置向后移一位。前面假设的左右分区是有序的是通过递归来实现,见merge_sort。
List = [49,38,65,97,76,13,27,49]
def merge_sort(List):
if len(List) <= 1:
return List
mid = len(List) // 2
left = merge_sort(List[:mid])
right = merge_sort(List[mid:])
return merge(left,right)
def merge(left,right):
i = 0
j = 0
result = []
while(i<len(left)) and (j<len(right)):
if left[i] <= right[j]:
result.append(left[i])
i += 1
else:
result.append(right[j])
j += 1
result.extend(left[i:])
result.extend(right[j:])
return result
print(merge_sort(List))
9038

被折叠的 条评论
为什么被折叠?



