数据结构与算法-排序(三)
来源:互联网 发布: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
- 数据结构与算法-排序(三)
- <三>java数据结构与算法 选择排序
- 数据结构与算法三:希尔排序
- 三、数据结构与算法--排序(冒泡排序、选择排序)
- 【数据结构与算法】排序
- 数据结构与算法 -排序
- 数据结构与算法:排序
- 【数据结构与算法】排序
- [算法与数据结构] 排序
- 数据结构与算法:排序
- 数据结构与算法三
- 数据结构与算法之三直接插入排序
- 数据结构与算法之三 深入学习排序
- 用Python 学习数据结构与算法 三、选择排序
- 数据结构与算法之一(三种简单排序)
- 【数据结构与算法】排序算法
- 数据结构与算法排序算法
- 数据结构与算法-----排序算法
- Openlayers中Google地图的加载
- 解决代码中写radiobutton颜色选择器无效问题
- 房地产投资继续乐观
- Launcher的启动过程
- Python3.6+selenium3.3+Firefox52
- 数据结构与算法-排序(三)
- Shell脚本main函数
- 如何压缩ndk的so库
- JAVA多线程之——线程中断
- 1的个数
- Java JDBC(3) DDL操作
- 查看数据库死锁SQL语句
- intellij idea包路径和文件夹目录的坑
- Can you answer these queries? HDU