排序
文章平均质量分 60
soyisou
码农,砖家,斜杠青年
展开
-
STL 的sort函数常用案例
重载小于号的两种方法方法1:struct Sum{ int s, c, d; // s表示c和d的平方 bool operator<(const Sum& t) const //返回较小的那个 { if(s != t.s) return s < t.s; if(c != t.c) return c < t.c; return d < t.d; }} sum[N];sort(sum, s原创 2021-08-11 00:38:56 · 195 阅读 · 0 评论 -
双指针算法
双指针算法使用 i, j 两个变量,不会退的扫描一个或两个数组朴素做法 — O(n2)O(n ^ 2)O(n2)for(int i = 0; i < n; i ++){ for(int j = 0; j < n; j ++)}双指针算法 ---- O(n)O(n)O(n)for(int i=0,j=0;i<n;i++){ while(j<i && check(i,j)) j++; //每道题目的具体逻辑}核心思想将朴素做原创 2021-08-11 00:36:05 · 67 阅读 · 0 评论 -
归并排序 - 数据结构 - 算法
算法思想将两个或多个有序序列合并为一个有序序列注:二叉树的第 h 层最多有 $ 2^{h-1} $ 个结点,若树高为 h ,则应该满足 $ n <= 2^{ h-1} $ , 即 $ h - 1 = \lceil log{_2}n\rceil $, 即趟数 = $ \lceil log{_2}n\rceil $每趟归并时间复杂度为 $ O(n) $ ,则算法时间复杂度为 $ O(nlogn) $空间复杂度为 $ O(n) $ ,来自于辅助数组时间复杂度最好 — O(nlogn)O(原创 2021-08-10 12:38:55 · 323 阅读 · 0 评论 -
堆排序 - 数据结构 - 算法
算法思想每一趟将堆顶元素加入到有序子序列(与待排元序列中的最后一个元素交换),并将待排序列再次调整为大根堆(即将小元素 “下坠” )。注:1. 基于 “大根堆” 的堆排序得到的是递增序列2. 一个结点每“下坠”一层,最多只需要比对关键字两次3. 若树高为h,某结点在第i层,将这个结点向下调整最多只需要“下坠”h - i层,关键字的比对次数不超过2(h - i)4. n个结点的完全二叉树,树高 h = $\lfloor log{_2}n \rfloor $ + 1时间复杂度最好 — O(n原创 2021-08-10 12:37:11 · 1317 阅读 · 0 评论 -
选择排序 - 数据结构 - 算法
算法思想每一趟在待排元素中选取关键字最小的元素加入到有序序列注:简单选择排序与序列的初始状态无关,仅与序列的元素个数有关时间复杂度最好 — O(n2)O(n^2)O(n2)最坏 — O(n2)O(n^2)O(n2)平均 — O(n2)O(n^2)O(n2)演示动画空间复杂度仅用一个临时变量 min — O(1)O(1)O(1)稳定性不稳定适用性顺序表链表算法特点不稳定,但改变策略可以写出不产生“不稳定现象”的选择排序算法可用于链式存储结构移动次数较少,当每一原创 2021-08-10 12:35:50 · 304 阅读 · 0 评论 -
快速排序 - 数据结构 -算法
算法思想在待排序表 a[0...n-1]中任取一个元素pivot作为枢轴(或基准,通常取首元素),通过一趟排序将待排序表划分为独立的两个部分a[0...k-1]和a[k + 1 ...n-1],使得a[0...k-1]中的所有元素均小于pivot,a[k + 1...n - 1]中所有元素均大于等于pivot,则pivot放在其最终的位置a[k]上,这一过程成为一次“划分”,然后分别递归地对两个子表重复上述过程,直到每一部分内只有一个元素或空为止,即所有元素放在了其最终的位置上。时间复杂度最好 —原创 2021-08-10 12:34:18 · 271 阅读 · 0 评论 -
冒泡排序 - 数据结构 - 算法
算法思想从前往后(或从后往前)两两比较相邻元素的值,若为逆序则交换它们,直到序列比较完为止,称这样的过程为一趟冒泡排序,进行n-1趟冒泡排序即可完成排序。注:1. 每一趟排序都可以使一个元素移动到最终位置,已确定最终位置的元素在之后的处理中无需再对比2. 如果某一趟排序过程中未发生交换,则算法可提前结束时间复杂度最好 — O(n)O(n)O(n) 有序序列最坏 — O(n2)O(n^2)O(n2) 逆序序列平均 — O(n1.3)O(n^ {1.3})O(n1.3)演示原创 2021-08-10 12:32:02 · 126 阅读 · 0 评论 -
希尔排序 - 数据结构 - 算法
算法思想先将序列分为若干个子序列,然后对各个子序列进行直接插入排序,等到序列基本有序时,再对整个序列进行一次直接插入排序。即先追求表中的元素部分有序,再逐渐逼近全局有序。优点:让关键字值小的元素能能够很快移动到前面,且序列基本有序时进行直接插入排序时间效率会提升很多。时间复杂度最好 — O无O无O无最坏 — O(n2)O(n^2)O(n2)平均 — O(n1.3)O(n^1.3)O(n1.3)演示动画空间复杂度 O(1)使用数组头号元素a[0]稳定性不稳定适用性仅适用于顺序原创 2021-08-10 12:16:01 · 312 阅读 · 0 评论 -
折半插入排序 - 数据结构 - 算法
算法思想设置三个变量low,high,mid,令mid = (low + high) / 2,若a[mid] > key, 则令high = mid - 1,否则令low = mid + 1,直到low > hig时停止循环。对序列中的每个元素做以上处理,找到合适位置将其他元素后移,进行插入。时间复杂度最好 — O(nlogn)O(nlogn)O(nlogn)最坏 — O(n2)O(n^2)O(n2)平均 — O(n2)O(n^2)O(n2)####注:比较次数与待排序列的初始装态原创 2021-08-10 12:14:02 · 485 阅读 · 0 评论 -
直接插入排序 - 数据结构 - 算法
算法思想将序列分为有序部分和无序部分,从无序部分中依次选择元素,与有序部分进行比较,找到合适的位置,将原来的元素后移,将元素插入到相应的位置,直到全部记录插入完成。动画演示时间复杂度最好 — O(n)O(n)O(n) 序列有序最坏 — O(n2)O(n^2)O(n2) 序列逆序平均 — O(n2)O(n^2)O(n2)空间复杂度 O(1)不带哨兵用临时变量temp带哨兵用a[0]稳定性稳定适用性顺序表链表算法特点稳定排序算法简易,易实现顺序表、链表原创 2021-08-10 12:10:13 · 128 阅读 · 0 评论