首页 > 其他分享 >Insertion Sort

Insertion Sort

时间:2023-11-03 10:12:12浏览次数:33  
标签:Sort 数组 交换 个数 相遇 Insertion 逆序

想象一下,冒泡排序交换的两个数一定是原数组的逆序对(反证容易证明:如果不是逆序对,相遇之后不会交换。两个数只有在相遇的时候才会使得下标相对大小互换,相遇之前一定是左的在左,右的在右。而不是逆序对的话,相遇的时候也不会交换,所以就一直不会交换)。

因为有序数组一定没有逆序对,所以逆序对一定换完了,所以swap次数就是逆序对总数。


我的写法是\(f_{i,j}\),表示\(k\in [j,n]\)中\(a[k]<a[i]\)的\(k\)的个数。

交换次数就是\(f_{1,2}+f_{2,3}+...\)。(通过此式可以发现,如果\(a[x]<a[y],x,y\),交换二者一定不优)

比如枚举交换的是\(x,y,x<y\),那么\(x\)之前和\(y\)之后的点的\(f_{k,k+1}\)都没有改变,对交换次数贡献不变。

对于\(x\)和\(y\),\(f_{y,y+1} \rightarrow f_{y,x+1} + [a[x]<a[y]?]\),\(f_{x,x+1}\rightarrow f_{x,y+1}\)。

如果通过上面的式子退出来逆序对才要交换,\([a[x]<a[y]]=0\)。

现在关键是\([x+1,y-1]\)中的数的\(f_{k,k+1}\)又是如何变化的呢?

昨晚不知道怎么想的,用了权值树状数组查询一段值域的数的个数,其实完全不用。

\(a[k]>a[x]\),则\(f_{k,k+1}\leftarrow +1\)。
\(a[k]>a[y]\),则\(f_{k,k+1}\leftarrow -1\)。

也就是说,要知道\(k\in [x+1,y-1],a[k]>t\)的数的个数。

数据范围很小,再预处理一个\(g_{i,x}\),表示\(k \in [1,i],a[k]>x\)的数的个数不就行了?

那对答案的贡献不就是\(g_{y-1,a[x]}-g_{x,a[x]}-g_{y-1,a[y]}+g_{x,a[y]}\)吗?

昨晚把上面的式子合并了,写成了\(a[y]<a[k]<a[x]\),要\(-1\),其实也可以写成\(a[k]<a[x]\),减去\(a[k]<a[y]\)的。

然后再套一层前缀和预处理,就出来了。

标签:Sort,数组,交换,个数,相遇,Insertion,逆序
From: https://www.cnblogs.com/zhangchenxin/p/17806995.html

相关文章

  • 『做题记录』[CF1601F]Two Sorts
    [CF1601F]TwoSortslink:https://codeforces.com/problemset/problem/1601/FDescription  有一个数列\(\{a_1,a_2,\ldots,a_n\}\)是一个\(1\simn\)的排列,且所有的数都按照字典序排序,现在给出整数\(n(1\leqn\leq10^{12})\),求\(\left(\sum_{i=1}^n((i-a_i)\bm......
  • 无涯教程-Clojure - sort函数
    返回元素的排序序列。sort-语法以下是语法。(sortseq1)参数   - "seq1"是元素的顺序列表。返回值 - 返回元素的排序序列。sort-示例以下是排序示例。(nsclojure.examples.example(:gen-class));;ThisprogramdisplaysHelloLearnfk(defnEx......
  • AGC304Ex Constrained Topological Sort 题解
    AT一个直接的想法是拓扑排序时从小到大标号:每次在入度为\(0\)的点中找到\(l_{u}\lei\)且\(r_{u}\)最小的\(u\),令\(p_{u}=i\)问题是如果\(r_{u}\)很大,那么\(u\)被标号的优先级很低,会连累\(u\)的后继中\(r\)较小的点做法是倒着拓扑一遍,令\(r_{u}\leftarrow\m......
  • P5156 [USACO18DEC] Sort It Out P 题解
    题意有一个长度为\(n\)的排列\(a_1,a_2,\cdots,a_n\),选出\(\{1,2,\cdots,n\}\)的一个子集,对这个子集中的数依次进行如下操作:设当前数为\(v\),则若\(a_v\)大于\(a_{v+1}\)(如果有的话),就交换。如果小于,则若\(a_v<a_{v-1}\)(如果有的话),就交换。重复上述操作知道\(a_{v-1}<......
  • PAT_A1101 Quick Sort
    Thereisaclassicalprocessnamed partition inthefamousquicksortalgorithm.Inthisprocesswetypicallychooseoneelementasthepivot.Thentheelementslessthanthepivotaremovedtoitsleftandthoselargerthanthepivottoitsright.Given ......
  • javascript: Sorting Algorithms
      /***fileSort.js*ide:vscodeJavaScriptSortingAlgorithms*插件:IntelliSense,JSDoc,CodeLens,DebuggerforChrome,静态代码检查:ESLint,JSHint,FlowLangugaeSupport,StandardJS-JavaScriptStandardStyle,koroFileHeader(文件头注释),测试插件:Mochasideba......
  • javascript: Sorting Algorithms
     /***fileSort.js*ide:vscodeJavaScriptSortingAlgorithms*插件:IntelliSense,JSDoc,CodeLens,DebuggerforChrome,静态代码检查:ESLint,JSHint,FlowLangugaeSupport,StandardJS-JavaScriptStandardStyle,koroFileHeader(文件头注释),测试插件:Mochasidebar,M......
  • PAT_A1067 Sort with Swap(0, i)
    Givenanypermutationofthenumbers{0,1,2,..., N−1},itiseasytosorttheminincreasingorder.Butwhatif Swap(0,*) istheONLYoperationthatisallowedtouse?Forexample,tosort{4,0,2,1,3}wemayapplytheswapoperationsinthefollowi......
  • 冒泡排序算法(Bubble Sort)—经典排序算法
    导言冒泡排序是最基本、最简单的排序算法之一,它通过多次遍历待排序的数组或列表,依次比较相邻的元素并交换位置,使得较大(或较小)的元素逐渐“浮”到数组的一端。原理分析冒泡排序算法通过多次遍历待排序的数组或列表,依次比较相邻的元素并交换位置,使得较大(或较小)的元素逐渐“浮”到数组......
  • sortable 拖拽后数据变更但视图不变
    问题表格中某两行拖拽换序,使用sortable.js在拖拽结束后调用换序接口,再更新数据列表。问题是数据变了,但视图不变。如下图所示:分析vue无法检测数组中顺序的变化。即使采用$set,$forceUpdate(),给组件添加key属性,仍然无法解决该问题。解决办法请求数据列表前,先重置列表。......