Algorithm
排序算法
千与千与千
不学无术、一无是处
展开
-
几种数据结构的查找、插入、删除的时间复杂度对比
1、查找是指给定一个元素值进行查找2、对于数组,插入是指插入到某一下标位置,元素后移数据结构 查找 插入 删除 数组 O(n) O(n) O(n) 有序数组 O(logn)(二分查找) O(n) O(n) 单链表 O(n) O(n) O(n) 有序单链表 O(n) O(n) O(n) 双链表 O(n) O(n) O(n) 有序双链表 O(n) O(n)原创 2020-09-23 10:03:22 · 3661 阅读 · 0 评论 -
快速排序的优化方法——代码实现、时间对比
前言在网上看到了快速排序的优化方法,但是没有完整的代码,于是自己花时间实现了代码。全部代码在尾部链接。快速排序的目标数组分为4种:随机数组,降序数组,升序数组,重复数组。数组的长度为一百万。随机数组:确保没有重复的元素值降序数组:随机数组的降序排序升序数组:随机数组的升序排序重复数组:全部为10的数组1、基本快速排序基本的快速排序,就是选取开始位置或者末尾位置的元素作为基准运行时间:(时间单位:ms) 随机数组 降序数组 升序数组 重复数组原创 2020-09-15 12:44:47 · 160 阅读 · 0 评论 -
快速排序算法:非递归方法,递归法与非递归法性能比较
排序算法的递归法:https://blog.csdn.net/liu_feng_zi_/article/details/102736892非递归法思想:1、使用栈模拟递归2、将以基准划分的左右两个子序列的边界索引,即子序列的起始位置和终止位置,压入栈中3、弹出栈顶的两个元素,即某一段子序列的边界索引,执行步骤24、重复步骤2、3代码:#include <iostream>#include <vector>#include <stack>原创 2020-09-12 16:13:38 · 835 阅读 · 1 评论 -
排序算法——堆排序
堆:堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。如下图:对大顶堆中的节点映射到数组中,就是:由堆是完全二叉树,可以知道当堆中某个节点的编号为i时,如果这个节点有左右子树,那么左子树的节点编号为2*i,右子树的节点编号为2*i+1(当然这是在根节点编号为1的情况时)。那么上面的数组从逻辑上讲就是一个堆结构,可以用公式来描述堆的定义:大顶堆:arr[i] >= arr[2i+1..原创 2020-08-26 15:09:42 · 291 阅读 · 0 评论 -
两个字符串——最长公共子序列、最长公共子串——动态规划
一、最长公共子序列在两个字符串中,某一些字符都存在于两个串中,并且某些字符的前后顺序与在两个字符串的前后顺序相同,这些字符组成的串,就是两个字符串的公共子序列,其中最长的公共子序列,就是两个字符串的最长公共子序列(Longest Common Subsequence, LCS)如下面的两个字符串:abdkcbdakmnak,bdk,bd都是两个字符串的公共子序列,其中bdk就是最长的公共子序列二、核心思想假设两个字符串:和求两个字符串的子串和的最长公共子序列分为...原创 2020-08-11 16:40:10 · 1723 阅读 · 0 评论 -
01背包问题(个人理解,勿看)
01背包问题:前提假设:一个具有有限承重的背包,一排宝石,每个宝石的重量不同,价值也不同解决问题:背包如何装宝石,才能获得最大的价值注意:01表示取和不取,0表示不取,1表示取解决方式:1、将整个问题,缩小为一个小问题,再逐步扩大为原本的问题2、先假设从前1个宝石里取宝石,那么在背包承重为1的情况下,计算获取的最大价值的方案,在背包称重为2的情况下,计算获取的最大价值的方案,背包承重为3的情况下……,一直到背包承重为最大时,计算获取的最大价值的方案3、再假设从前2个宝石里取宝石.原创 2020-08-03 19:34:27 · 208 阅读 · 0 评论 -
寻找闭环入口——快慢指针
核心思想:两个人在操场上赛跑,一个人跑的快,一个人跑的慢。那么在某一时刻,跑的快的人一定会赶上跑的慢的人算法实现:定义两个指针:slow和fast,fast指针每次移动两个位置,slow指针每次移动一个位置第一步:确定是否存在闭环...原创 2020-08-01 16:38:23 · 322 阅读 · 0 评论 -
排序算法——归并排序
算法描述(升序):1、将数列平均分为两个子数列2、将每个子序列再进行平均分3、分无可分时,对子数列进行排序,然后一层一层的回归父数列进行排序图解(网图,侵删):代码:#include <iostream>#include <vector>using namespace std;void sort(int, int, vector<int> &a, vector<int> &r);void merge(in.原创 2020-06-29 11:03:30 · 215 阅读 · 0 评论 -
排序算法——快速排序
算法描述(升序):1、从数列中挑选一个元素作为“基准”元素,一般挑选中间位置或起始位置的元素。2、重新排序数列,将比基准小的元素放在基准前面,比基准大的元素放在基准后面,这个操作称为分区(partition)。3、将小于基准的子数列和大于基准的子数列,重复步骤1、2,递归实现。图解(网图,侵删):代码:#include <iostream>#inclu...原创 2019-10-25 09:59:36 · 254 阅读 · 0 评论 -
排序算法——插入排序
算法描述(升序):1、标记位置2的元素,向前遍历,若前面的元素比标记的元素大,则继续向前遍历,若前面的元素比标记的元素小,则在该元素后面插入标记的元素,其余元素的位置一次向后+1。2、标记位置3的元素,向前遍历,若前面的元素比标记的元素大,则继续向前遍历,若前面的元素比标记的元素小,则在该元素后面插入标记的元素,其余元素的位置一次向后+1。3、……图解(网图,侵删):代码:...原创 2019-10-24 16:20:04 · 166 阅读 · 0 评论 -
排序算法——选择排序
算法描述(升序):1、标记第一个元素,与数列中该元素后面的元素进行比较,如果小(大)于该元素,则将标记元素改为该元素,与该元素后面的全部元素进行比较后,即找到数列中最小的元素,与数列的第一个位置的元素交换位置。2、标记第二个元素,与数列中该元素后面的元素进行比较,如果小(大)于该元素,则将标记元素改为该元素,与该元素后面的全部元素进行比较后,即找到该子数列中的最小的元素,与数列的第二个位置...原创 2019-10-24 13:44:47 · 98 阅读 · 0 评论 -
排序算法——冒泡排序
算法描述(升序):1、从初始位置开始,比较相邻两个元素的大小,即位置(0,1),如果“前元素”大于“后元素”,就将两个元素交换位置;2、继续比较下一对相邻的元素,即位置(1,2),如果“前元素”大于“后元素”,就将两个元素交换位置;3、重复上述步骤,直至到最后一对相邻元素,则此时整个数列的最大的元素,位于数列的末尾位置;4、继续排序,重复一次步骤1、2。进行步骤3时,只需要比较到倒...原创 2019-10-24 11:15:11 · 346 阅读 · 0 评论