合并排序实验报告总结 合并排序c语言算法代码( 七 )


● 重复步骤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总结
各种排序的稳定性,时间复杂度和空间复杂度总结:
我们比较时间复杂度函数的情况:

推荐阅读