C++ STL 数据结构与算法 —— 排序】的更多相关文章

1. Top k 大的数 排序后直接索引输出:O(nlog⁡n)" role="presentation">O(nlogn)O(nlog⁡n) std::sort(v.rbegin(), r.rend()); return v[k-1]; 使用优先队列(O(klog⁡n)" role="presentation">O(klogn)O(klog⁡n),每 pop 一个元素,都需重排大顶堆): std::priority_queue<…
1.直接插入排序 给定一个数组后,从第二个元素开始,如果比第一个小,就跟他交换位置,否则不动:第三个元素如果比第二个小,把第三个跟第二个交换位置,在把第二个与第一个比较:..... def insert_sort(arr): length = len(arr) for i in range(1,length): if arr[i] < arr[i-1]: for j in range(i-1,-1,-1): if arr[j+1] < arr[j]: arr[j+1],arr[j] = arr…
排序算法的介绍 排序也称排序算法 (Sort Algorithm),排序是将一组数据,依指定的顺序进行排列的过程. 排序的分类 1) 内部排序: 指将需要处理的所有数据都加载 到内部存储器(内存)中进行排序. 2) 外部排序法:数据量过大,无法全部加载到内 存中,需要借助外部存储(文件等)进行 排序. 常见的排序算法分类 算法的时间复杂度 度量一个程序(算法)执行时间的两种方法 1.事后统计的方法这种方法可行, 但是有两个问题:一是要想对设计的算法的运行性能进行评测,需要实际运行该程序: 二是所…
摘要 堆排序需要用到一种数据结构,大顶堆.大顶堆是一种二叉树结构,本质是父节点的数大于它的左右子节点的数,左右子节点的大小顺序不限制,也就是根节点是最大的值. 这里就是不断的将大顶堆的根节点的元素和尾部元素交换,交换到大顶堆没有可以被交换的元素为止.后面再说大顶堆的逻辑. 逻辑 首先将序列通过大顶堆排序.然后不断的从堆中取出顶部元素放在尾部,直到大顶堆元素为空. 流程 对序列进行原地建堆操作 重复下面操作,直到堆元素数量为 1 交换堆顶元素与尾元素 堆的元素数量减 1 对 0 位置进行 1 次…
摘要 计数排序本质就是统计不同元素出现的次数,然后将元素依次从小到大放置,每个元素看统计的次数,就紧挨着放置几个同样的元素. 看似简单的处理,在算法中,会依据统计的元素次数推算出每个元素的索引位置,这就是算法的魅力. 逻辑 统计每个整数在序列中出现的次数,进而推导出每个整数在有序序列中的索引. 这是通过空间换取时间的方式. 流程 获取序列中的最大值 统计每个元素出现的次数 按照顺序进行赋值 实现 根据获取到的最大值,创建序列统计序列中的元素出现的次数.创建的序列大小是 max+1,让最大值也可以…
摘要 选择排序的逻辑是先遍历比较出序列中最大的,然后把最大的放在最后位置. 遵循这个逻辑,用代码实现时,做到1.减少比较次数之外,这里引入一个新的指标 - 稳定性,2.保证排序过程中的稳定性也是一个优化处理 代码逻辑 从头遍历序列,分别和尾部元素比较,记录最大的元素坐标 遍历完成后,和尾部位置交换位置 忽略尾部已经交换的元素,执行 1 和 2 步骤 实现 依据逻辑来看,最大值是放在尾部,并放置后,下次循环排除这个放置最大值的位置,for 循环从尾部开始最合适. 小循环开始前,需要先创建变量记录最…
摘要 看希尔排序需要先想象出一个二维的矩阵,在这个矩阵中,有多少列数据全看步长(一定的规则得到).处理完之后,就再接着用另一个步长组成矩阵处理.直到步长全部使用完. 这里的巧妙之处就是没有把序列先处理成二维数组,而是通过与步长配合,依旧在一维的序列中处理. 逻辑 希尔排序相当于把序列当作一个矩阵,逐列进行排序.当全部排序完成,整个序列就完全有序 矩阵的列数取决于步长序列 流程 创建步长序列 从最大步长开始,整列排序,直到排序完成 实现 创建步长序列,这里是有一个数组存放步长数据.步长是序列的长度…
摘要 基数排序是进行整数序列的排序,它是将整数从个位开始,直到最大数的最后一位截止,每一个进位(比如个位.十位.百位)的数进行排序比较. 每个进位做的排序比较是用计数排序的方式处理,所以基数排序离不开计数排序. 逻辑 对整数依次从个位数.十位数...进行排序.基数排序非常适合用于整数排序 对每一轮的排序可以使用计数排序的方法处理 基数排序和计数排序来做个简单的比较时,可以看到基数排序每一个进位都要进行一次计数排序,所以比较循环多一些.但是每个进制上的数范围是 0 到 9 这 10 个数,所以需要…
摘要 桶排序和基数排序类似,相当于基数排序的另外一种逻辑.它是将取值范围当做创建桶的数量,桶的长度就是序列的大小.通过处理比较元素的数值,把元素放在桶的特定位置,然后遍历桶,就可以得到有序的序列. 逻辑 创建一定数量的桶(数组或者链表).制定规则将序列中的元素均匀地分布在不同的桶中.然后对每个桶内排序,最后合并非空的桶. 流程 创建一定数量的桶 元素均匀分布在桶中(根据规则来看) 桶内排序 合并非空的桶 下面还用无序的整数元素序列,将这个序列给排序有序. 实现 获取序列中的最大值,这里按照最大值…
笔者在学习数据结构与算法时,尝试着将排序算法以动画的形式呈现出来更加方便理解记忆,本文配合Demo 在Object-C中学习数据结构与算法之排序算法阅读更佳. 目录 选择排序 冒泡排序 插入排序 快速排序 双路快速排序 三路快速排序 堆排序 总结与收获 参考与阅读 选择排序 选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n²) 的时间复杂度.所以用到它的时候,数据规模越小越好.唯一的好处可能就是不占用额外的内存空间了吧. 1.算法步骤 首先在未排序序列中找到最小(大)元素,存放到排…