数据结构与算法-排序(三)

来源:互联网 发布:bilibili客户端mac 编辑:程序博客网 时间:2024/04/27 22:28

归并排序


  • 基本思想

假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到[n/2]个长度为2或者1的有序子序列;再两两归并,…,如此重复,直至得到一个长度为n的有序序列为止。归并排序是一种比较占用内存,但是却效率高并稳定的算法,时间复杂度是O(logN).

堆排序


  • 基本思想

对简单选择排序的一种改进,堆是一个完全二叉树,它是将待排序的序列构造成一个最大堆或者最小堆。然后,整个序列的堆顶就是根结点。移走堆顶,调整其余元素,重新构成一个堆。如此反复执行,便能得到一个序列了。堆排序的时间复杂度是O(logN),由于记录的比较和交换是跳跃式进行的,因此是一种不稳定的排序。

代码实现(python)

#! /usr/bin/env python# -*- coding:utf-8 -*-import random# 归并排序,感觉递归的实现很耗内存,有继续优化的空间def merge(left, right):    i, j = 0, 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 += left[i:]    result += right[j:]    return resultdef merge_sort(lists):    # 归并排序    if len(lists) <= 1:        return lists    num = len(lists) / 2    # 递归将lists[:num]归并为有序的left    left = merge_sort(lists[:num])    # 递归将lists[num:]归并为有序的right    right = merge_sort(lists[num:])    result = merge(left, right)    return result# 堆排序def sift_down(location, list_length):    flag = 0    while location * 2 <= list_length and flag == 0:        # 首先判断它和左儿子的关系, 并用t记录值较大的节点编号        if heap_list[location] < heap_list[location*2]:            t = location * 2        else:            t = location        # 如果它有右儿子 ,再对右儿子进行讨论        if location*2+1 <= list_length:            # 如果右儿子的值更大, 更新较小的结点编号            if heap_list[t] < heap_list[location*2+1]:                t = location*2+1        # 如果发现最大的结点编号不是自己, 说明子结点中有比父结点更大的        if t != location:            heap_list[t], heap_list[location] = heap_list[location], heap_list[t]            location = t        else:            flag = 1    returndef heap_sort():    # 建立堆函数    list_length = len(heap_list) - 1    for start in range((list_length/2), 0, -1):        sift_down(start, list_length)    # 堆排序    while list_length > 1:        heap_list[1], heap_list[list_length] = heap_list[list_length], heap_list[1]        list_length -= 1        sift_down(1, list_length)    return test_list[1:]if __name__ == "__main__":   testlist = [random.randint(1, 100) for _ in range(1, 1000000)]   print merge_sort(testlist)   heap_list = [-1] + [random.randint(1, 100) for _ in range(1, 10000000)]   print(heap_sort())
0 0