logo

3-suuntainen yhdistämislajittelu kohdassa c

Tässä artikkelissa käsitellään kolmea tapaa yhdistää lajittelu c. Yhdistetyssä lajittelussa taulukko jaetaan rekursiivisesti kahteen osaan, lajitellaan ja lopuksi yhdistetään.

Yhdistämislajittelumuunnelmaa käsitellään kolmisuuntaisena yhdistämislajitteluna, joka jakaa taulukon kolmeen osaan sen sijaan, että se jakaisi sen kahteen osaan. Yhdistämislajittelu jakaa rekursiivisesti taulukon puolikokoisiksi aliryhmiksi. Samoin kolmisuuntainen yhdistämislajittelu hajottaa taulukon kolmanneksen kokoisiksi aliryhmiksi.

Yhdistetyssä lajittelussa taulukko jaetaan rekursiivisesti kahteen osaan, lajitellaan ja lopuksi yhdistetään. Yhdistelmälajittelun muunnelmaa kutsutaan 3-suuntaiseksi yhdistämislajiksi, jossa taulukon jakamisen sijaan se jakaa kolmeen osaan.

Esimerkkejä yhdistämislajeista: Alla on esimerkki yhdistämislajittelusta -

 Input: 4, 8, -4, -9, 10, 55, 46, 70, -56, 78, 90, 67, 85, 20, 29 Output: -56 -9 -4 4 8 10 20 29 46 55 67 70 78 85 90 Input: 98, -67 Output: -67 98 

Kolmisuuntaisen yhdistämislajittelun aikamonimutkaisuus on nlog3n.

Esimerkki 1: Tässä annamme esimerkin 3 tavasta yhdistää lajittelu c:ssä. Esimerkki on annettu alla -

 #include usingnamespacestd; voidmerge1(intgArr1[], intlow1, intmid1,intmid2, inthigh1, intdestArr1[]) { inti = low1, a = mid1, b = mid2, c = low1; while((i <mid1) 2 && (a < mid2) (b high1)) { if(garr1[i] garr1[j]) garr1[b]) destarr1[c++]="gArr1[i++];" } else else{ if(garr1[j] garr1[b]){ while((i mid1) mid2)){ garr1[a]){ while((a high1)){ if(garr1[a] while(i while(a while(b high) voidmergesort3wayrec(intgarr1[], intlow1, inthigh1, intdestarr1[]) if(high1 - low1 2) return; intmid1="low1" + ((high1 low1) 3); intmid2="low1" * 3) 1; mergesort3wayrec(destarr1, low1, mid1, garr1); mid2, high1, merge(destarr1, voidmergesort3way(intgarr1[], intn1){ if(n1="=" 0) intfarr1[n]; for(inti="0;" i n1; i++) farr1[i]="gArr1[i];" mergesort3wayrec(farray1, 0, n, garray1); garr1[i]="fArr1[i];" int main(){ intdata1[]="{4," 8, -4, -9, 10, 55, 46, 70, -56, 78, 90, 67, 85, 20, 29}; mergesort3way(data1,10); cout<< 'the result after the three way of merge sort is: '; 10; data1[i] << ' return0; pre> <p> <strong>Result:</strong> Now we compile the above program, and after successful compilation, we run it. Then the result is given below -</p> <pre> The result after the three way of merge sort is: -56 -9 -4 4 8 10 20 29 46 55 67 70 78 85 90 </pre> <h2>How does the above code work?</h2> <p>Here we first replica the contents of the statistics array into every other array called fArr. Then type the array by locating the midpoint that divides the array into three elements and calls the type characteristic on every array. The basic case of recursion is when an array has size 1 and is returned from a function. Then the array merging starts, and finally, the sorted array is in fArr and copied to gArr.</p> <h2>The time complexity of the merge sort:</h2> <p>Three-way merge sort equation is: T(n) = 2T(n/2) + O(n)</p> <p>Similarly, for a three-way merge sort, we have: T( n) = 3T(n/3) + O(n)</p> <p>Solving with the master method, its complexity is O(n log 3n).</p> <p>Time complexity appears less than a two-way merge sort, but the more comparisons in the merge function, the more time it might take in practice.</p> <p>So, in this article, we briefly discuss 3 ways to merge sort in c. The merge sort variant is treated as a 3-way merge sort that splits the array into three parts instead of splitting it into two parts. We also give an example that is related to this topic.</p> <hr></mid1)>

Miten yllä oleva koodi toimii?

Tässä kopioimme ensin tilastotaulukon sisällön jokaiseen toiseen taulukkoon nimeltä fArr. Kirjoita sitten taulukko etsimällä keskipiste, joka jakaa taulukon kolmeen elementtiin ja kutsuu jokaisen taulukon tyyppiominaisuuden. Rekursion perustapaus on, kun taulukon koko on 1 ja se palautetaan funktiosta. Sitten taulukon yhdistäminen alkaa, ja lopuksi lajiteltu taulukko on faarissa ja kopioidaan gArriin.

Yhdistämisen aika monimutkaisuus:

Kolmisuuntaisen yhdistämisen lajitteluyhtälö on: T(n) = 2T(n/2) + O(n)

Samoin kolmisuuntaisessa yhdistämislajittelussa meillä on: T(n) = 3T(n/3) + O(n)

Päämenetelmällä ratkaistaessa sen kompleksisuus on O(n log 3n).

Aika monimutkaisuus näyttää vähemmän kuin kaksisuuntainen yhdistäminen, mutta mitä enemmän vertailuja yhdistämistoiminnossa, sitä enemmän aikaa se voi viedä käytännössä.

Joten tässä artikkelissa käsittelemme lyhyesti kolmea tapaa yhdistää lajittelu c. Yhdistämislajittelumuunnelmaa käsitellään kolmisuuntaisena yhdistämislajitteluna, joka jakaa taulukon kolmeen osaan sen sijaan, että se jakaisi sen kahteen osaan. Annamme myös esimerkin, joka liittyy tähän aiheeseen.