● 重复步骤2,直到所有元素排序完毕,即序列数为1
以上节选自维基百科
代码如下:
def merge(left, right):
result =
while left and right:
if left[0] < right[0]:
result.append(left.pop(0))
else:
result.append(right.pop(0))
if left:
result= left
if right:
result= right
return result
def merge_sort(numberlist):
if len(numberlist) <= 1:
return numberlist
mid = len(numberlist) // 2
left = numberlist[:mid]
right = numberlist[mid:]
left = merge_sort(left)
right = merge_sort(right)
return merge(left, right)
六、快速排序从数列中挑出一个元素,称为“基准”(pivot),
● 重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(相同的数可以到任何一边) 。在这个分割结束之后,该基准就处于数列的中间位置 。这个称为分割(partition)操作 。
● 递归地(recursively)把小于基准值元素的子数列和大于基准值元素的子数列排序 。
● 递归到最底部时,数列的大小是零或一,也就是已经排序好了 。这个算法一定会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去 。
以上节选自维基百科
代码如下:
def quick_sort(array):
if len(array) < 2:
return array
else:
pivot = array[0]
less = [i for i in array[1:] if i <= pivot]
greater = [i for i in array[1:] if i > pivot]
return quick_sort(less)[pivot]quick_sort(greater)
七、堆排序
若以升序排序说明,把数组转换成最大堆积(Max-Heap Heap),这是一种满足最大堆积性质(Max-Heap Property)的二叉树:对于除了根之外的每个节点i, A[parent(i)] ≥ A[i] 。
重复从最大堆积取出数值最大的结点(把根结点和最后一个结点交换,把交换后的最后一个结点移出堆),并让残余的堆积维持最大堆积性质 。
def heap_sort(numberlist):
length = len(numberlist)
def sift_down(start, end):
root = start
while True:
child = 2 * root1
if child > end:
break
if child1 <= end and numberlist[child] < numberlist[child1]:
child= 1
if numberlist[root] < numberlist[child]:
numberlist[root], numberlist[child] = numberlist[child], numberlist[root]
root = child
else:
break
# 创建最大堆
for start in range((length - 2) // 2, -1, -1):
sift_down(start, length - 1)
# 堆排序
for end in range(length - 1, 0, -1):
numberlist[0], numberlist[end] = numberlist[end], numberlist[0]
sift_down(0, end - 1)
return numberlist
八、计数排序以上节选自维基百科
代码如下:
def counting_sort(numberlist, maxnumber): # maxnumber为数组中的最大值
length = len(numberlist) # 待排序数组长度
b = [0 for i in range(length)] # 设置输出序列,初始化为0
c = [0 for i in range(maxnumber1)] # 设置技术序列,初始化为0
for j in numberlist:
c[j] = c[j]1
for i in range(1, len(c)):
c[i] = c[i]c[i - 1]
for j in numberlist:
b[c[j] - 1] = j
c[j] = c[j] - 1
return b
总结
各种排序的稳定性,时间复杂度和空间复杂度总结:
我们比较时间复杂度函数的情况:
推荐阅读
- excel合并单元格快捷键是什么
- 我来教你Excel把多个单元格内容合并到一个单元格的操作教程 我来教你跳舞
- 小编教你闪电PDF转换成WORD转换器合并或分割PDF文件的详细操作教程
- 小编教你Excel快速合并两列数据/文本的操作教程 小编教你怎么选:羽毛球拍3U和4U的区别
- 教你excel表格里直接相加来求和的操作方法 Excel表合并
- 笔记本电脑分盘教程 电脑分盘怎么合并
- 小编分享迅捷CAD编辑器把CAD里多个图形合并成块的相关流程 迅捷影视分享码
- 西樵实验小学升学率 佛山市公办小学排名?
- 教你Excel 2019自动排序编号的详细步骤教程
- 金山pdf阅读器如何合并pdf文件,几秒达成