算法与数据结构
逃出你的肖生克
这个作者很懒,什么都没留下…
展开
-
排序算法之直接插入排序
根据寻找插入位置的方法对插入排序进行分类可以分为以下三类:直接插入排序折半插入排序希尔插入排序本篇主要介绍直接插入排序算法。算法描述插入排序的核心思想是每步将一个待排序的元素,按照其排序码的大小,插入到前面已经排好序的一组元素的合适位置上,直至元素全部插入完毕为止。如何为一个待排序元素在排好序的元素集合中寻找合适的插入位置是一个关键点,有三种合理的方法可以达到这个目的(这里将待插入元素记为A原创 2017-05-23 17:28:53 · 606 阅读 · 0 评论 -
排序算法之折半插入排序
折半插入排序算法是对直接插入排序算法的简单改进,主要将折半比较的思想引入插入排序,在一定程度上提高了直接插入排序的效率。算法描述直接插入排序算法中,当第i-1趟需要将第i个元素插入到0~i-1个元素之间时,总是需要从第i-个元素开始,依次与前面的每一个元素进行比较,直至找到合适的位置进行插入。这样比较的过程显然没有利用到0~i-1个元素已经有序这一有效信息,折半插入排序则对此进行了改进。当需要将第i原创 2017-05-23 17:35:02 · 11211 阅读 · 0 评论 -
排序算法之选择排序
选择排序算法也是蛮力算法设计思想的具体应用之一,算法较为简单,下面进行阐述。算法思想描述选择排序算法的核心思想就是循环扫描列表元素,每次找出剩余元素中最小的元素放在合适的位置上。选择排序开始的时候,首先扫描整个列表(列表元素个数为n),找到它的最小元素,然后和第一个元素进行交换,将最小元素放在它在有序表中的最终位置上,接着从第二个元素开始扫描列表,找到剩余n-1个元素中的最小元素,再和第二个元素交换原创 2017-05-22 19:32:08 · 318 阅读 · 0 评论 -
排序算法之冒泡排序
冒泡排序冒泡排序算法是蛮力算法设计思想的一个典型应用,相应的还有选择排序,后后续会谈到。冒泡排序算法的核心思想就是比较表中的相邻元素,如果它们是逆序的话就交换它们的位置,重复多次以后,最终,最大的元素就“沉到”了列表中的最后一个位置。第二遍操作将第二大的元素沉下去,依次执行n-次,从而得到有序的列表。第i遍冒泡排序可以用下面的示例图表示: 竖线后面的表示已经排好序的部分最大元素,前面表示排序的过程原创 2017-05-18 11:43:46 · 328 阅读 · 0 评论 -
排序算法之归并排序
归并排序算法是分治思想的典型应用,下面具体阐述该算法。算法描述归并排序算法是建立在归并操作上的一种有效的排序算法,整体思路就是对于一个需要排序的数组A[0…n-1],归并排序首先将它一分为二:A[0…,(n/2)-1]和A[n/2…,n-1],然后对每个子数组进行递归排序,最后将两个排序好的子数组合并为一个有序数组。算法分析算法时间复杂度分析: 最好情况:O(nlogn); 最坏情况:O(nlo原创 2017-05-22 20:39:08 · 368 阅读 · 1 评论 -
排序算法之快速排序
快速排序算法也是基于分治思想的一种重要排序算法。归并排序算法是按照元素在数组中的位置对它们进行划分,而快速排序则是根据元素的值对它们进行划分。算法描述快速排序算法对给定数组中的元素进行重新排列,以得到一个快速排序的分区。在这样的一个分区中,所有在s下标之前的元素都小于等于A[s],所有在s下标之后的元素都大于等于A[s],如下所示: 这样建立了一个分区之后,A[s]已经位于它在有序数组中的最终位置原创 2017-05-22 21:43:03 · 316 阅读 · 1 评论 -
水塘抽样算法
Reservoir Sampling 蓄水池抽样算法,经典抽样 随机读取数据,如何保证真随机是不可能的,因为计算机的随机函数是伪随机的。但是在不考虑计算机随机函数的情况下,如何保证数据的随机采样呢?1.系统提供的shuffle函数 C++/Java都提供有shuffle函数,可以对容器内部的数据打乱,保持随机排序。 C++:1 tem转载 2017-07-05 08:24:35 · 684 阅读 · 0 评论