mirror of
https://github.com/TheAlgorithms/C-Plus-Plus.git
synced 2026-03-21 04:18:34 +08:00
525 lines
38 KiB
HTML
525 lines
38 KiB
HTML
<!-- HTML header for doxygen 1.12.0-->
|
||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
|
||
<head>
|
||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
||
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
|
||
<meta name="generator" content="Doxygen 1.14.0"/>
|
||
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
||
<title>TheAlgorithms/C++: sorting/count_inversions.cpp File Reference</title>
|
||
<link rel="icon" href="../../favicon.svg" type="image/x-icon" />
|
||
<link href="../../tabs.css" rel="stylesheet" type="text/css"/>
|
||
<script type="text/javascript" src="../../jquery.js"></script>
|
||
<script type="text/javascript" src="../../dynsections.js"></script>
|
||
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/@xpack-3rd-party/doxygen-awesome-css@2.2.0-1/doxygen-awesome-darkmode-toggle.js"></script>
|
||
<script type="text/javascript">
|
||
DoxygenAwesomeDarkModeToggle.init()
|
||
</script>
|
||
<script type="text/javascript" src="../../clipboard.js"></script>
|
||
<link href="../../navtree.css" rel="stylesheet" type="text/css"/>
|
||
<script type="text/javascript" src="../../navtreedata.js"></script>
|
||
<script type="text/javascript" src="../../navtree.js"></script>
|
||
<script type="text/javascript" src="../../cookie.js"></script>
|
||
<link href="../../search/search.css" rel="stylesheet" type="text/css"/>
|
||
<script type="text/javascript" src="../../search/searchdata.js"></script>
|
||
<script type="text/javascript" src="../../search/search.js"></script>
|
||
<script type="text/javascript">
|
||
window.MathJax = {
|
||
options: {
|
||
ignoreHtmlClass: 'tex2jax_ignore',
|
||
processHtmlClass: 'tex2jax_process'
|
||
},
|
||
loader: {
|
||
load: ['[tex]/ams']
|
||
},
|
||
tex: {
|
||
macros: {},
|
||
packages: ['base','configmacros','ams']
|
||
}
|
||
};
|
||
</script>
|
||
<script type="text/javascript" id="MathJax-script" async="async" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml.js"></script>
|
||
<link href="../../doxygen.css" rel="stylesheet" type="text/css" />
|
||
<link href="../../doxygen-awesome.css" rel="stylesheet" type="text/css"/>
|
||
</head>
|
||
<body>
|
||
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
|
||
<div id="titlearea">
|
||
<table cellspacing="0" cellpadding="0">
|
||
<tbody>
|
||
<tr id="projectrow">
|
||
<td id="projectlogo"><img alt="Logo" src="../../project_logo.png"/></td>
|
||
<td id="projectalign">
|
||
<div id="projectname">TheAlgorithms/C++<span id="projectnumber"> 1.0.0</span>
|
||
</div>
|
||
<div id="projectbrief">All the algorithms implemented in C++</div>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
<!-- end header part -->
|
||
<!-- Generated by Doxygen 1.14.0 -->
|
||
<script type="text/javascript">
|
||
var searchBox = new SearchBox("searchBox", "../../search/",'.html');
|
||
</script>
|
||
<script type="text/javascript">
|
||
$(function() { codefold.init(); });
|
||
</script>
|
||
<script type="text/javascript" src="../../menudata.js"></script>
|
||
<script type="text/javascript" src="../../menu.js"></script>
|
||
<script type="text/javascript">
|
||
$(function() {
|
||
initMenu('../../',true,false,'search.php','Search',true);
|
||
$(function() { init_search(); });
|
||
});
|
||
</script>
|
||
<div id="main-nav"></div>
|
||
</div><!-- top -->
|
||
<div id="side-nav" class="ui-resizable side-nav-resizable">
|
||
<div id="nav-tree">
|
||
<div id="nav-tree-contents">
|
||
<div id="nav-sync" class="sync"></div>
|
||
</div>
|
||
</div>
|
||
<div id="splitbar" style="-moz-user-select:none;"
|
||
class="ui-resizable-handle">
|
||
</div>
|
||
</div>
|
||
<script type="text/javascript">
|
||
$(function(){initNavTree('d2/d26/count__inversions_8cpp.html','../../',''); });
|
||
</script>
|
||
<div id="container">
|
||
<div id="doc-content">
|
||
<!-- window showing the filter options -->
|
||
<div id="MSearchSelectWindow"
|
||
onmouseover="return searchBox.OnSearchSelectShow()"
|
||
onmouseout="return searchBox.OnSearchSelectHide()"
|
||
onkeydown="return searchBox.OnSearchSelectKey(event)">
|
||
</div>
|
||
|
||
<!-- iframe showing the search results (closed by default) -->
|
||
<div id="MSearchResultsWindow">
|
||
<div id="MSearchResults">
|
||
<div class="SRPage">
|
||
<div id="SRIndex">
|
||
<div id="SRResults"></div>
|
||
<div class="SRStatus" id="Loading">Loading...</div>
|
||
<div class="SRStatus" id="Searching">Searching...</div>
|
||
<div class="SRStatus" id="NoMatches">No Matches</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="header">
|
||
<div class="headertitle"><div class="title">count_inversions.cpp File Reference</div></div>
|
||
</div><!--header-->
|
||
<div class="contents">
|
||
|
||
<p>Counting Inversions using <a href="https://en.wikipedia.org/wiki/Merge_sort" target="_blank">Merge Sort</a>
|
||
<a href="#details">More...</a></p>
|
||
<div class="textblock"><code>#include <cassert></code><br />
|
||
<code>#include <cstdint></code><br />
|
||
<code>#include <iostream></code><br />
|
||
<code>#include <vector></code><br />
|
||
</div><div class="textblock"><div class="dynheader">
|
||
Include dependency graph for count_inversions.cpp:</div>
|
||
<div class="dyncontent">
|
||
<div class="center"><iframe scrolling="no" loading="lazy" frameborder="0" src="../../db/d6c/count__inversions_8cpp__incl.svg" width="336" height="111"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe></div>
|
||
</div>
|
||
</div>
|
||
<p><a href="../../d2/d26/count__inversions_8cpp_source.html">Go to the source code of this file.</a></p>
|
||
<table class="memberdecls">
|
||
<tr class="heading"><td colspan="2"><h2 id="header-namespaces" class="groupheader"><a id="namespaces" name="namespaces"></a>
|
||
Namespaces</h2></td></tr>
|
||
<tr class="memitem:sorting" id="r_sorting"><td class="memItemLeft" align="right" valign="top">namespace  </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d5/d91/namespacesorting.html">sorting</a></td></tr>
|
||
<tr class="memdesc:d5/d91/namespacesorting"><td class="mdescLeft"> </td><td class="mdescRight">for working with vectors <br /></td></tr>
|
||
<tr class="memitem:inversion" id="r_inversion"><td class="memItemLeft" align="right" valign="top">namespace  </td><td class="memItemRight" valign="bottom"><a class="el" href="../../d9/d13/namespaceinversion.html">inversion</a></td></tr>
|
||
<tr class="memdesc:d9/d13/namespaceinversion"><td class="mdescLeft"> </td><td class="mdescRight">Functions for counting inversions using Merge Sort algorithm. <br /></td></tr>
|
||
</table><table class="memberdecls">
|
||
<tr class="heading"><td colspan="2"><h2 id="header-func-members" class="groupheader"><a id="func-members" name="func-members"></a>
|
||
Functions</h2></td></tr>
|
||
<tr class="memitem:aad643c14734394e784a75169cb58132f" id="r_aad643c14734394e784a75169cb58132f"><td class="memTemplParams" colspan="2">template<typename T> </td></tr>
|
||
<tr class="memitem:aad643c14734394e784a75169cb58132f template"><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="#aad643c14734394e784a75169cb58132f">sorting::inversion::merge</a> (T *arr, T *temp, uint32_t left, uint32_t mid, uint32_t right)</td></tr>
|
||
<tr class="memdesc:aad643c14734394e784a75169cb58132f"><td class="mdescLeft"> </td><td class="mdescRight">Function to merge two sub-arrays. <br /></td></tr>
|
||
<tr class="memitem:ae97a486e14101c4822ea8dc47f0d1661" id="r_ae97a486e14101c4822ea8dc47f0d1661"><td class="memTemplParams" colspan="2">template<typename T> </td></tr>
|
||
<tr class="memitem:ae97a486e14101c4822ea8dc47f0d1661 template"><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="#ae97a486e14101c4822ea8dc47f0d1661">sorting::inversion::mergeSort</a> (T *arr, T *temp, uint32_t left, uint32_t right)</td></tr>
|
||
<tr class="memdesc:ae97a486e14101c4822ea8dc47f0d1661"><td class="mdescLeft"> </td><td class="mdescRight">Implement merge Sort and count inverions while merging. <br /></td></tr>
|
||
<tr class="memitem:a3332498eabf6579ef059c0d0e9f4ec80" id="r_a3332498eabf6579ef059c0d0e9f4ec80"><td class="memTemplParams" colspan="2">template<class T> </td></tr>
|
||
<tr class="memitem:a3332498eabf6579ef059c0d0e9f4ec80 template"><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="#a3332498eabf6579ef059c0d0e9f4ec80">sorting::inversion::countInversion</a> (T *arr, const uint32_t size)</td></tr>
|
||
<tr class="memdesc:a3332498eabf6579ef059c0d0e9f4ec80"><td class="mdescLeft"> </td><td class="mdescRight">Function <a class="el" href="#a3332498eabf6579ef059c0d0e9f4ec80" title="Function countInversion() returns the number of inversion present in the input array....">countInversion()</a> returns the number of inversion present in the input array. Inversions are an estimate of how close or far off the array is to being sorted. <br /></td></tr>
|
||
<tr class="memitem:a851ca6a0391d14fb49a97d55e4377497" id="r_a851ca6a0391d14fb49a97d55e4377497"><td class="memTemplParams" colspan="2">template<typename T> </td></tr>
|
||
<tr class="memitem:a851ca6a0391d14fb49a97d55e4377497 template"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="#a851ca6a0391d14fb49a97d55e4377497">sorting::inversion::show</a> (T *arr, const uint32_t array_size)</td></tr>
|
||
<tr class="memdesc:a851ca6a0391d14fb49a97d55e4377497"><td class="mdescLeft"> </td><td class="mdescRight">UTILITY function to print array. <br /></td></tr>
|
||
<tr class="memitem:aa8dca7b867074164d5f45b0f3851269d" id="r_aa8dca7b867074164d5f45b0f3851269d"><td class="memItemLeft" align="right" valign="top">static void </td><td class="memItemRight" valign="bottom"><a class="el" href="#aa8dca7b867074164d5f45b0f3851269d">test</a> ()</td></tr>
|
||
<tr class="memdesc:aa8dca7b867074164d5f45b0f3851269d"><td class="mdescLeft"> </td><td class="mdescRight">Test implementations. <br /></td></tr>
|
||
<tr class="memitem:ae66f6b31b5ad750f1fe042a706a4e3d4" id="r_ae66f6b31b5ad750f1fe042a706a4e3d4"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="#ae66f6b31b5ad750f1fe042a706a4e3d4">main</a> ()</td></tr>
|
||
<tr class="memdesc:ae66f6b31b5ad750f1fe042a706a4e3d4"><td class="mdescLeft"> </td><td class="mdescRight">Program Body contains all main funtionality. <br /></td></tr>
|
||
</table>
|
||
<a name="details" id="details"></a><h2 id="header-details" class="groupheader">Detailed Description</h2>
|
||
<div class="textblock"><p>Counting Inversions using <a href="https://en.wikipedia.org/wiki/Merge_sort" target="_blank">Merge Sort</a> </p>
|
||
<p>Program to count the number of inversions in an array using merge-sort.</p>
|
||
<p>The count of inversions help to determine how close the array is to be sorted in ASCENDING order.</p>
|
||
<p>two elements a[i] and a[j] form an inversion if <span class="tt">a[i]</span> > <span class="tt">a[j]</span> and i < j</p>
|
||
<p>Time Complexity --> <span class="tt">O(n.log n)</span></p>
|
||
<p>Space Complexity --> <span class="tt">O(n)</span> ; additional array <span class="tt">temp[1..n]</span> </p>
|
||
<h3 class="doxsection"><a class="anchor" id="autotoc_md115"></a>
|
||
Algorithm</h3>
|
||
<ol type="1">
|
||
<li>The idea is similar to merge sort, divide the array into two equal or almost equal halves in each step until the base case is reached.</li>
|
||
<li>Create a function merge that counts the number of inversions when two halves of the array are merged, create two indices i and j, i is the index for first half and j is an index of the second half. if <span class="tt">a[i]</span> is greater than <span class="tt">a[j]</span>, then there are (mid – i) inversions, Because left and right subarrays are sorted, so all the remaining elements in left-subarray (a[i+1], a[i+2] … a[mid]) will be greater than a[j].</li>
|
||
<li>Create a recursive function to divide the array into halves and find the answer by summing the number of inversions is the first half, number of inversion in the second half and the number of inversions by merging the two.</li>
|
||
<li>The base case of recursion is when there is only one element in the given half.</li>
|
||
<li>Print the answer</li>
|
||
</ol>
|
||
<dl class="section author"><dt>Author</dt><dd><a href="https://github.com/rakshitraj" target="_blank">Rakshit Raj</a> </dd></dl>
|
||
|
||
<p class="definition">Definition in file <a class="el" href="../../d2/d26/count__inversions_8cpp_source.html">count_inversions.cpp</a>.</p>
|
||
</div><a name="doc-func-members" id="doc-func-members"></a><h2 id="header-doc-func-members" class="groupheader">Function Documentation</h2>
|
||
<a id="a3332498eabf6579ef059c0d0e9f4ec80" name="a3332498eabf6579ef059c0d0e9f4ec80"></a>
|
||
<h2 class="memtitle"><span class="permalink"><a href="#a3332498eabf6579ef059c0d0e9f4ec80">◆ </a></span>countInversion()</h2>
|
||
|
||
<div class="memitem">
|
||
<div class="memproto">
|
||
<div class="memtemplate">
|
||
template<class T> </div>
|
||
<table class="memname">
|
||
<tr>
|
||
<td class="memname">uint32_t sorting::inversion::countInversion </td>
|
||
<td>(</td>
|
||
<td class="paramtype">T *</td> <td class="paramname"><span class="paramname"><em>arr</em></span>, </td>
|
||
</tr>
|
||
<tr>
|
||
<td class="paramkey"></td>
|
||
<td></td>
|
||
<td class="paramtype">const uint32_t</td> <td class="paramname"><span class="paramname"><em>size</em></span> )</td>
|
||
</tr>
|
||
</table>
|
||
</div><div class="memdoc">
|
||
|
||
<p>Function countInversion() returns the number of inversion present in the input array. Inversions are an estimate of how close or far off the array is to being sorted. </p>
|
||
<p>Number of inversions in a sorted array is 0. Number of inversion in an array[1...n] sorted in non-ascending order is n(n-1)/2, since each pair of elements contitute an inversion.</p>
|
||
<dl class="params"><dt>Parameters</dt><dd>
|
||
<table class="params">
|
||
<tr><td class="paramname">arr</td><td>- array, data member of std::vector<int>, input for counting inversions </td></tr>
|
||
<tr><td class="paramname">array_size</td><td>- number of elementa in the array </td></tr>
|
||
</table>
|
||
</dd>
|
||
</dl>
|
||
<dl class="section return"><dt>Returns</dt><dd>number of inversions in input array, sorts the array </dd></dl>
|
||
|
||
<p class="definition">Definition at line <a class="el" href="../../d2/d26/count__inversions_8cpp_source.html#l00164">164</a> of file <a class="el" href="../../d2/d26/count__inversions_8cpp_source.html">count_inversions.cpp</a>.</p>
|
||
<div class="fragment"><div class="line"><span class="lineno"> 164</span> {</div>
|
||
<div class="line"><span class="lineno"> 165</span> std::vector<T> temp;</div>
|
||
<div class="line"><span class="lineno"> 166</span> temp.reserve(size);</div>
|
||
<div class="line"><span class="lineno"> 167</span> temp.assign(size, 0);</div>
|
||
<div class="line"><span class="lineno"> 168</span> <span class="keywordflow">return</span> <a class="code hl_function" href="#ae97a486e14101c4822ea8dc47f0d1661">mergeSort</a>(arr, temp.data(), 0, size - 1);</div>
|
||
<div class="line"><span class="lineno"> 169</span>}</div>
|
||
<div class="ttc" id="acount__inversions_8cpp_html_ae97a486e14101c4822ea8dc47f0d1661"><div class="ttname"><a href="#ae97a486e14101c4822ea8dc47f0d1661">sorting::inversion::mergeSort</a></div><div class="ttdeci">uint32_t mergeSort(T *arr, T *temp, uint32_t left, uint32_t right)</div><div class="ttdoc">Implement merge Sort and count inverions while merging.</div><div class="ttdef"><b>Definition</b> <a href="../../d2/d26/count__inversions_8cpp_source.html#l00132">count_inversions.cpp:132</a></div></div>
|
||
</div><!-- fragment -->
|
||
</div>
|
||
</div>
|
||
<a id="ae66f6b31b5ad750f1fe042a706a4e3d4" name="ae66f6b31b5ad750f1fe042a706a4e3d4"></a>
|
||
<h2 class="memtitle"><span class="permalink"><a href="#ae66f6b31b5ad750f1fe042a706a4e3d4">◆ </a></span>main()</h2>
|
||
|
||
<div class="memitem">
|
||
<div class="memproto">
|
||
<table class="memname">
|
||
<tr>
|
||
<td class="memname">int main </td>
|
||
<td>(</td>
|
||
<td class="paramtype">void</td> <td class="paramname"><span class="paramname"><em></em></span></td><td>)</td>
|
||
<td></td>
|
||
</tr>
|
||
</table>
|
||
</div><div class="memdoc">
|
||
|
||
<p>Program Body contains all main funtionality. </p>
|
||
<dl class="section return"><dt>Returns</dt><dd>void</dd></dl>
|
||
<p>Main function </p><dl class="section return"><dt>Returns</dt><dd>0 on exit </dd></dl>
|
||
|
||
<p class="definition">Definition at line <a class="el" href="../../d2/d26/count__inversions_8cpp_source.html#l00271">271</a> of file <a class="el" href="../../d2/d26/count__inversions_8cpp_source.html">count_inversions.cpp</a>.</p>
|
||
<div class="fragment"><div class="line"><span class="lineno"> 271</span> {</div>
|
||
<div class="line"><span class="lineno"> 272</span> <a class="code hl_function" href="#aa8dca7b867074164d5f45b0f3851269d">test</a>(); <span class="comment">// Run test implementations</span></div>
|
||
<div class="line"><span class="lineno"> 273</span> <span class="comment">// body(); // test your own array</span></div>
|
||
<div class="line"><span class="lineno"> 274</span> <span class="keywordflow">return</span> 0;</div>
|
||
<div class="line"><span class="lineno"> 275</span>}</div>
|
||
<div class="ttc" id="acount__inversions_8cpp_html_aa8dca7b867074164d5f45b0f3851269d"><div class="ttname"><a href="#aa8dca7b867074164d5f45b0f3851269d">test</a></div><div class="ttdeci">static void test()</div><div class="ttdoc">Test implementations.</div><div class="ttdef"><b>Definition</b> <a href="../../d2/d26/count__inversions_8cpp_source.html#l00194">count_inversions.cpp:194</a></div></div>
|
||
</div><!-- fragment -->
|
||
</div>
|
||
</div>
|
||
<a id="aad643c14734394e784a75169cb58132f" name="aad643c14734394e784a75169cb58132f"></a>
|
||
<h2 class="memtitle"><span class="permalink"><a href="#aad643c14734394e784a75169cb58132f">◆ </a></span>merge()</h2>
|
||
|
||
<div class="memitem">
|
||
<div class="memproto">
|
||
<div class="memtemplate">
|
||
template<typename T> </div>
|
||
<table class="memname">
|
||
<tr>
|
||
<td class="memname">uint32_t sorting::inversion::merge </td>
|
||
<td>(</td>
|
||
<td class="paramtype">T *</td> <td class="paramname"><span class="paramname"><em>arr</em></span>, </td>
|
||
</tr>
|
||
<tr>
|
||
<td class="paramkey"></td>
|
||
<td></td>
|
||
<td class="paramtype">T *</td> <td class="paramname"><span class="paramname"><em>temp</em></span>, </td>
|
||
</tr>
|
||
<tr>
|
||
<td class="paramkey"></td>
|
||
<td></td>
|
||
<td class="paramtype">uint32_t</td> <td class="paramname"><span class="paramname"><em>left</em></span>, </td>
|
||
</tr>
|
||
<tr>
|
||
<td class="paramkey"></td>
|
||
<td></td>
|
||
<td class="paramtype">uint32_t</td> <td class="paramname"><span class="paramname"><em>mid</em></span>, </td>
|
||
</tr>
|
||
<tr>
|
||
<td class="paramkey"></td>
|
||
<td></td>
|
||
<td class="paramtype">uint32_t</td> <td class="paramname"><span class="paramname"><em>right</em></span> )</td>
|
||
</tr>
|
||
</table>
|
||
</div><div class="memdoc">
|
||
|
||
<p>Function to merge two sub-arrays. </p>
|
||
<p><a class="el" href="../../d5/d4c/group__sorting.html#ga460c61cd948203b4816bef2accb3fc73">merge()</a> function is called from <a class="el" href="../../d5/d4c/group__sorting.html#gab6b14fea48d9841e29b9fc26be6e05d7">mergeSort()</a> to merge the array after it split for sorting by the <a class="el" href="../../d5/d4c/group__sorting.html#gab6b14fea48d9841e29b9fc26be6e05d7">mergeSort()</a> funtion.</p>
|
||
<p>In this case the merge fuction will also count and return inversions detected when merging the sub arrays.</p>
|
||
<dl class="params"><dt>Parameters</dt><dd>
|
||
<table class="params">
|
||
<tr><td class="paramname">arr</td><td>input array, data-menber of vector </td></tr>
|
||
<tr><td class="paramname">temp</td><td>stores the resultant merged array </td></tr>
|
||
<tr><td class="paramname">left</td><td>lower bound of <span class="tt">arr[]</span> and left-sub-array </td></tr>
|
||
<tr><td class="paramname">mid</td><td>midpoint, upper bound of left sub-array, <span class="tt">(mid+1)</span> gives the lower bound of right-sub-array </td></tr>
|
||
<tr><td class="paramname">right</td><td>upper bound of <span class="tt">arr[]</span> and right-sub-array </td></tr>
|
||
</table>
|
||
</dd>
|
||
</dl>
|
||
<dl class="section return"><dt>Returns</dt><dd>number of inversions found in merge step </dd></dl>
|
||
|
||
<p class="definition">Definition at line <a class="el" href="../../d2/d26/count__inversions_8cpp_source.html#l00085">85</a> of file <a class="el" href="../../d2/d26/count__inversions_8cpp_source.html">count_inversions.cpp</a>.</p>
|
||
<div class="fragment"><div class="line"><span class="lineno"> 85</span> {</div>
|
||
<div class="line"><span class="lineno"> 86</span> uint32_t i = left; <span class="comment">/* i --> index of left sub-array */</span></div>
|
||
<div class="line"><span class="lineno"> 87</span> uint32_t j = mid + 1; <span class="comment">/* j --> index for right sub-array */</span></div>
|
||
<div class="line"><span class="lineno"> 88</span> uint32_t k = left; <span class="comment">/* k --> index for resultant array temp */</span></div>
|
||
<div class="line"><span class="lineno"> 89</span> uint32_t inv_count = 0; <span class="comment">// inversion count</span></div>
|
||
<div class="line"><span class="lineno"> 90</span> </div>
|
||
<div class="line"><span class="lineno"> 91</span> <span class="keywordflow">while</span> ((i <= mid) && (j <= right)) {</div>
|
||
<div class="line"><span class="lineno"> 92</span> <span class="keywordflow">if</span> (arr[i] <= arr[j]) {</div>
|
||
<div class="line"><span class="lineno"> 93</span> temp[k++] = arr[i++];</div>
|
||
<div class="line"><span class="lineno"> 94</span> } <span class="keywordflow">else</span> {</div>
|
||
<div class="line"><span class="lineno"> 95</span> temp[k++] = arr[j++];</div>
|
||
<div class="line"><span class="lineno"> 96</span> inv_count +=</div>
|
||
<div class="line"><span class="lineno"> 97</span> (mid - i +</div>
|
||
<div class="line"><span class="lineno"> 98</span> 1); <span class="comment">// tricky; may vary depending on selection of sub-array</span></div>
|
||
<div class="line"><span class="lineno"> 99</span> }</div>
|
||
<div class="line"><span class="lineno"> 100</span> }</div>
|
||
<div class="line"><span class="lineno"> 101</span> <span class="comment">// Add remaining elements from the larger subarray to the end of temp</span></div>
|
||
<div class="line"><span class="lineno"> 102</span> <span class="keywordflow">while</span> (i <= mid) {</div>
|
||
<div class="line"><span class="lineno"> 103</span> temp[<a class="code hl_function" href="../../d4/d18/composite__simpson__rule_8cpp.html#a1b74d828b33760094906797042b89442">k</a>++] = arr[i++];</div>
|
||
<div class="line"><span class="lineno"> 104</span> }</div>
|
||
<div class="line"><span class="lineno"> 105</span> <span class="keywordflow">while</span> (j <= right) {</div>
|
||
<div class="line"><span class="lineno"> 106</span> temp[<a class="code hl_function" href="../../d4/d18/composite__simpson__rule_8cpp.html#a1b74d828b33760094906797042b89442">k</a>++] = arr[j++];</div>
|
||
<div class="line"><span class="lineno"> 107</span> }</div>
|
||
<div class="line"><span class="lineno"> 108</span> <span class="comment">// Copy temp[] to arr[]</span></div>
|
||
<div class="line"><span class="lineno"> 109</span> <span class="keywordflow">for</span> (k = left; <a class="code hl_function" href="../../d4/d18/composite__simpson__rule_8cpp.html#a1b74d828b33760094906797042b89442">k</a> <= right; <a class="code hl_function" href="../../d4/d18/composite__simpson__rule_8cpp.html#a1b74d828b33760094906797042b89442">k</a>++) {</div>
|
||
<div class="line"><span class="lineno"> 110</span> arr[<a class="code hl_function" href="../../d4/d18/composite__simpson__rule_8cpp.html#a1b74d828b33760094906797042b89442">k</a>] = temp[<a class="code hl_function" href="../../d4/d18/composite__simpson__rule_8cpp.html#a1b74d828b33760094906797042b89442">k</a>];</div>
|
||
<div class="line"><span class="lineno"> 111</span> }</div>
|
||
<div class="line"><span class="lineno"> 112</span> <span class="keywordflow">return</span> inv_count;</div>
|
||
<div class="line"><span class="lineno"> 113</span>}</div>
|
||
<div class="ttc" id="acomposite__simpson__rule_8cpp_html_a1b74d828b33760094906797042b89442"><div class="ttname"><a href="../../d4/d18/composite__simpson__rule_8cpp.html#a1b74d828b33760094906797042b89442">numerical_methods::simpson_method::k</a></div><div class="ttdeci">double k(double x)</div><div class="ttdoc">Another test function.</div><div class="ttdef"><b>Definition</b> <a href="../../d4/d18/composite__simpson__rule_8cpp_source.html#l00117">composite_simpson_rule.cpp:117</a></div></div>
|
||
</div><!-- fragment -->
|
||
</div>
|
||
</div>
|
||
<a id="ae97a486e14101c4822ea8dc47f0d1661" name="ae97a486e14101c4822ea8dc47f0d1661"></a>
|
||
<h2 class="memtitle"><span class="permalink"><a href="#ae97a486e14101c4822ea8dc47f0d1661">◆ </a></span>mergeSort()</h2>
|
||
|
||
<div class="memitem">
|
||
<div class="memproto">
|
||
<div class="memtemplate">
|
||
template<typename T> </div>
|
||
<table class="memname">
|
||
<tr>
|
||
<td class="memname">uint32_t sorting::inversion::mergeSort </td>
|
||
<td>(</td>
|
||
<td class="paramtype">T *</td> <td class="paramname"><span class="paramname"><em>arr</em></span>, </td>
|
||
</tr>
|
||
<tr>
|
||
<td class="paramkey"></td>
|
||
<td></td>
|
||
<td class="paramtype">T *</td> <td class="paramname"><span class="paramname"><em>temp</em></span>, </td>
|
||
</tr>
|
||
<tr>
|
||
<td class="paramkey"></td>
|
||
<td></td>
|
||
<td class="paramtype">uint32_t</td> <td class="paramname"><span class="paramname"><em>left</em></span>, </td>
|
||
</tr>
|
||
<tr>
|
||
<td class="paramkey"></td>
|
||
<td></td>
|
||
<td class="paramtype">uint32_t</td> <td class="paramname"><span class="paramname"><em>right</em></span> )</td>
|
||
</tr>
|
||
</table>
|
||
</div><div class="memdoc">
|
||
|
||
<p>Implement merge Sort and count inverions while merging. </p>
|
||
<p>The <a class="el" href="../../d5/d4c/group__sorting.html#gab6b14fea48d9841e29b9fc26be6e05d7">mergeSort()</a> function implements Merge Sort, a Divide and conquer algorithm, it divides the input array into two halves and calls itself for each sub-array and then calls the <a class="el" href="../../d5/d4c/group__sorting.html#ga460c61cd948203b4816bef2accb3fc73">merge()</a> function to merge the two halves.</p>
|
||
<dl class="params"><dt>Parameters</dt><dd>
|
||
<table class="params">
|
||
<tr><td class="paramname">arr</td><td>- array to be sorted </td></tr>
|
||
<tr><td class="paramname">temp</td><td>- merged resultant array </td></tr>
|
||
<tr><td class="paramname">left</td><td>- lower bound of array </td></tr>
|
||
<tr><td class="paramname">right</td><td>- upper bound of array </td></tr>
|
||
</table>
|
||
</dd>
|
||
</dl>
|
||
<dl class="section return"><dt>Returns</dt><dd>number of inversions in array </dd></dl>
|
||
|
||
<p class="definition">Definition at line <a class="el" href="../../d2/d26/count__inversions_8cpp_source.html#l00132">132</a> of file <a class="el" href="../../d2/d26/count__inversions_8cpp_source.html">count_inversions.cpp</a>.</p>
|
||
<div class="fragment"><div class="line"><span class="lineno"> 132</span> {</div>
|
||
<div class="line"><span class="lineno"> 133</span> uint32_t mid = 0, inv_count = 0;</div>
|
||
<div class="line"><span class="lineno"> 134</span> <span class="keywordflow">if</span> (right > left) {</div>
|
||
<div class="line"><span class="lineno"> 135</span> <span class="comment">// midpoint to split the array</span></div>
|
||
<div class="line"><span class="lineno"> 136</span> mid = (right + left) / 2;</div>
|
||
<div class="line"><span class="lineno"> 137</span> <span class="comment">// Add inversions in left and right sub-arrays</span></div>
|
||
<div class="line"><span class="lineno"> 138</span> inv_count += <a class="code hl_function" href="#ae97a486e14101c4822ea8dc47f0d1661">mergeSort</a>(arr, temp, left, mid); <span class="comment">// left sub-array</span></div>
|
||
<div class="line"><span class="lineno"> 139</span> inv_count += <a class="code hl_function" href="#ae97a486e14101c4822ea8dc47f0d1661">mergeSort</a>(arr, temp, mid + 1, right);</div>
|
||
<div class="line"><span class="lineno"> 140</span> </div>
|
||
<div class="line"><span class="lineno"> 141</span> <span class="comment">// inversions in the merge step</span></div>
|
||
<div class="line"><span class="lineno"> 142</span> inv_count += <a class="code hl_function" href="#aad643c14734394e784a75169cb58132f">merge</a>(arr, temp, left, mid, right);</div>
|
||
<div class="line"><span class="lineno"> 143</span> }</div>
|
||
<div class="line"><span class="lineno"> 144</span> <span class="keywordflow">return</span> inv_count;</div>
|
||
<div class="line"><span class="lineno"> 145</span>}</div>
|
||
<div class="ttc" id="acount__inversions_8cpp_html_aad643c14734394e784a75169cb58132f"><div class="ttname"><a href="#aad643c14734394e784a75169cb58132f">sorting::inversion::merge</a></div><div class="ttdeci">uint32_t merge(T *arr, T *temp, uint32_t left, uint32_t mid, uint32_t right)</div><div class="ttdoc">Function to merge two sub-arrays.</div><div class="ttdef"><b>Definition</b> <a href="../../d2/d26/count__inversions_8cpp_source.html#l00085">count_inversions.cpp:85</a></div></div>
|
||
</div><!-- fragment -->
|
||
</div>
|
||
</div>
|
||
<a id="a851ca6a0391d14fb49a97d55e4377497" name="a851ca6a0391d14fb49a97d55e4377497"></a>
|
||
<h2 class="memtitle"><span class="permalink"><a href="#a851ca6a0391d14fb49a97d55e4377497">◆ </a></span>show()</h2>
|
||
|
||
<div class="memitem">
|
||
<div class="memproto">
|
||
<div class="memtemplate">
|
||
template<typename T> </div>
|
||
<table class="memname">
|
||
<tr>
|
||
<td class="memname">void sorting::inversion::show </td>
|
||
<td>(</td>
|
||
<td class="paramtype">T *</td> <td class="paramname"><span class="paramname"><em>arr</em></span>, </td>
|
||
</tr>
|
||
<tr>
|
||
<td class="paramkey"></td>
|
||
<td></td>
|
||
<td class="paramtype">const uint32_t</td> <td class="paramname"><span class="paramname"><em>array_size</em></span> )</td>
|
||
</tr>
|
||
</table>
|
||
</div><div class="memdoc">
|
||
|
||
<p>UTILITY function to print array. </p>
|
||
<dl class="params"><dt>Parameters</dt><dd>
|
||
<table class="params">
|
||
<tr><td class="paramname">arr[]</td><td>array to print </td></tr>
|
||
<tr><td class="paramname">array_size</td><td>size of input array arr[] </td></tr>
|
||
</table>
|
||
</dd>
|
||
</dl>
|
||
<dl class="section return"><dt>Returns</dt><dd>void </dd></dl>
|
||
|
||
<p class="definition">Definition at line <a class="el" href="../../d2/d26/count__inversions_8cpp_source.html#l00179">179</a> of file <a class="el" href="../../d2/d26/count__inversions_8cpp_source.html">count_inversions.cpp</a>.</p>
|
||
<div class="fragment"><div class="line"><span class="lineno"> 179</span> {</div>
|
||
<div class="line"><span class="lineno"> 180</span> std::cout << <span class="stringliteral">"Printing array: \n"</span>;</div>
|
||
<div class="line"><span class="lineno"> 181</span> <span class="keywordflow">for</span> (uint32_t i = 0; i < array_size; i++) {</div>
|
||
<div class="line"><span class="lineno"> 182</span> std::cout << <span class="stringliteral">" "</span> << arr[i];</div>
|
||
<div class="line"><span class="lineno"> 183</span> }</div>
|
||
<div class="line"><span class="lineno"> 184</span> std::cout << <span class="stringliteral">"\n"</span>;</div>
|
||
<div class="line"><span class="lineno"> 185</span>}</div>
|
||
</div><!-- fragment -->
|
||
</div>
|
||
</div>
|
||
<a id="aa8dca7b867074164d5f45b0f3851269d" name="aa8dca7b867074164d5f45b0f3851269d"></a>
|
||
<h2 class="memtitle"><span class="permalink"><a href="#aa8dca7b867074164d5f45b0f3851269d">◆ </a></span>test()</h2>
|
||
|
||
<div class="memitem">
|
||
<div class="memproto">
|
||
<table class="mlabels">
|
||
<tr>
|
||
<td class="mlabels-left">
|
||
<table class="memname">
|
||
<tr>
|
||
<td class="memname">void test </td>
|
||
<td>(</td>
|
||
<td class="paramname"><span class="paramname"><em></em></span></td><td>)</td>
|
||
<td></td>
|
||
</tr>
|
||
</table>
|
||
</td>
|
||
<td class="mlabels-right">
|
||
<span class="mlabels"><span class="mlabel static">static</span></span> </td>
|
||
</tr>
|
||
</table>
|
||
</div><div class="memdoc">
|
||
|
||
<p>Test implementations. </p>
|
||
<dl class="section return"><dt>Returns</dt><dd>void </dd></dl>
|
||
|
||
<p class="definition">Definition at line <a class="el" href="../../d2/d26/count__inversions_8cpp_source.html#l00194">194</a> of file <a class="el" href="../../d2/d26/count__inversions_8cpp_source.html">count_inversions.cpp</a>.</p>
|
||
<div class="fragment"><div class="line"><span class="lineno"> 194</span> {</div>
|
||
<div class="line"><span class="lineno"> 195</span> <span class="comment">// Test 1</span></div>
|
||
<div class="line"><span class="lineno"> 196</span> std::vector<uint64_t> arr1 = {</div>
|
||
<div class="line"><span class="lineno"> 197</span> 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84,</div>
|
||
<div class="line"><span class="lineno"> 198</span> 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67,</div>
|
||
<div class="line"><span class="lineno"> 199</span> 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50,</div>
|
||
<div class="line"><span class="lineno"> 200</span> 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33,</div>
|
||
<div class="line"><span class="lineno"> 201</span> 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16,</div>
|
||
<div class="line"><span class="lineno"> 202</span> 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1};</div>
|
||
<div class="line"><span class="lineno"> 203</span> uint32_t size1 = arr1.size();</div>
|
||
<div class="line"><span class="lineno"> 204</span> uint32_t inv_count1 = 4950;</div>
|
||
<div class="line"><span class="lineno"> 205</span> uint32_t result1 = <a class="code hl_function" href="#a3332498eabf6579ef059c0d0e9f4ec80">sorting::inversion::countInversion</a>(arr1.data(), size1);</div>
|
||
<div class="line"><span class="lineno"> 206</span> assert(inv_count1 == result1);</div>
|
||
<div class="line"><span class="lineno"> 207</span> <span class="comment">// Test 2</span></div>
|
||
<div class="line"><span class="lineno"> 208</span> std::vector<int> arr2 = {22, 66, 75, 23, 11, 87, 2, 44, 98, 43};</div>
|
||
<div class="line"><span class="lineno"> 209</span> uint32_t size2 = arr2.size();</div>
|
||
<div class="line"><span class="lineno"> 210</span> uint32_t inv_count2 = 20;</div>
|
||
<div class="line"><span class="lineno"> 211</span> uint32_t result2 = <a class="code hl_function" href="#a3332498eabf6579ef059c0d0e9f4ec80">sorting::inversion::countInversion</a>(arr2.data(), size2);</div>
|
||
<div class="line"><span class="lineno"> 212</span> assert(inv_count2 == result2);</div>
|
||
<div class="line"><span class="lineno"> 213</span> <span class="comment">// Test 3</span></div>
|
||
<div class="line"><span class="lineno"> 214</span> std::vector<double> arr3 = {33.1, 45.2, 65.4, 76.5, 1.0,</div>
|
||
<div class="line"><span class="lineno"> 215</span> 2.9, 5.4, 7.7, 88.9, 12.4};</div>
|
||
<div class="line"><span class="lineno"> 216</span> uint32_t size3 = arr3.size();</div>
|
||
<div class="line"><span class="lineno"> 217</span> uint32_t inv_count3 = 21;</div>
|
||
<div class="line"><span class="lineno"> 218</span> uint32_t result3 = <a class="code hl_function" href="#a3332498eabf6579ef059c0d0e9f4ec80">sorting::inversion::countInversion</a>(arr3.data(), size3);</div>
|
||
<div class="line"><span class="lineno"> 219</span> assert(inv_count3 == result3);</div>
|
||
<div class="line"><span class="lineno"> 220</span> <span class="comment">// Test 4</span></div>
|
||
<div class="line"><span class="lineno"> 221</span> std::vector<char> arr4 = {<span class="charliteral">'a'</span>, <span class="charliteral">'b'</span>, <span class="charliteral">'c'</span>, <span class="charliteral">'d'</span>, <span class="charliteral">'e'</span>};</div>
|
||
<div class="line"><span class="lineno"> 222</span> uint32_t size4 = arr4.size();</div>
|
||
<div class="line"><span class="lineno"> 223</span> uint32_t inv_count4 = 0;</div>
|
||
<div class="line"><span class="lineno"> 224</span> uint32_t result4 = <a class="code hl_function" href="#a3332498eabf6579ef059c0d0e9f4ec80">sorting::inversion::countInversion</a>(arr4.data(), size4);</div>
|
||
<div class="line"><span class="lineno"> 225</span> assert(inv_count4 == result4);</div>
|
||
<div class="line"><span class="lineno"> 226</span>}</div>
|
||
<div class="ttc" id="acount__inversions_8cpp_html_a3332498eabf6579ef059c0d0e9f4ec80"><div class="ttname"><a href="#a3332498eabf6579ef059c0d0e9f4ec80">sorting::inversion::countInversion</a></div><div class="ttdeci">uint32_t countInversion(T *arr, const uint32_t size)</div><div class="ttdoc">Function countInversion() returns the number of inversion present in the input array....</div><div class="ttdef"><b>Definition</b> <a href="../../d2/d26/count__inversions_8cpp_source.html#l00164">count_inversions.cpp:164</a></div></div>
|
||
</div><!-- fragment -->
|
||
</div>
|
||
</div>
|
||
</div><!-- contents -->
|
||
</div><!-- doc-content -->
|
||
<div id="page-nav" class="page-nav-panel">
|
||
<div id="page-nav-resize-handle"></div>
|
||
<div id="page-nav-tree">
|
||
<div id="page-nav-contents">
|
||
</div><!-- page-nav-contents -->
|
||
</div><!-- page-nav-tree -->
|
||
</div><!-- page-nav -->
|
||
</div><!-- container -->
|
||
<!-- start footer part -->
|
||
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
|
||
<ul>
|
||
<li class="navelem"><a href="../../dir_bb1b521853a9c46347182a9d10420771.html">sorting</a></li><li class="navelem"><a href="../../d2/d26/count__inversions_8cpp.html">count_inversions.cpp</a></li>
|
||
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="../../doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.14.0 </li>
|
||
</ul>
|
||
</div>
|
||
</body>
|
||
</html>
|