JavaRush /Блоги Java /Random-TG /Татбиқи навъбандии ҳубобӣ дар Java

Татбиқи навъбандии ҳубобӣ дар Java

Дар гурӯҳ нашр шудааст
Шумораи хеле зиёди алгоритмҳои ҷудокунӣ мавҷуданд, ки аксари онҳо хеле мушаххасанд ва барои ҳалли доираи танги масъалаҳо ва кор бо намудҳои мушаххаси додаҳо таҳия шудаанд. Аммо дар байни ин гуногунрангӣ, соддатарин алгоритми сазовори навъҳои ҳубобӣ мебошад, ки онро бо ҳар забони барномасозӣ амалӣ кардан мумкин аст. Сарфи назар аз содда будани он, он дар асоси бисёр алгоритмҳои хеле мураккаб ҷойгир аст. Бартарии дигари муҳими он соддагии он аст ва аз ин рӯ, онро метавон фавран дар хотир дошт ва бидуни ҳеҷ гуна адабиёти иловагӣ дар пеши шумо амалӣ созед. Татбиқи навъбандии ҳубобӣ дар Java - 1

Муқаддима

Тамоми Интернети муосир аз шумораи зиёди намудҳои гуногуни сохторҳои додаҳо, ки дар пойгоҳи додаҳо ҷамъ оварда шудаанд, иборат аст. Онҳо ҳама гуна маълумотро аз маълумоти шахсии корбарон то ядрои семантикии системаҳои автоматикунонидашудаи хеле зеҳнӣ нигоҳ медоранд. Бояд гуфт, ки ҷудокунии додаҳо дар ин миқдори зиёди иттилооти сохторӣ нақши бениҳоят муҳим мебозад. Мураттабкунӣ метавонад як қадами ҳатмӣ пеш аз ҷустуҷӯи ҳама гуна маълумот дар базаи маълумот бошад ва дониши алгоритмҳои ҷудокунӣ дар барномасозӣ нақши хеле муҳимро мебозад.

Аз рӯи чашмони мошин ва чашмони инсон ҷудокунӣ

Биёед тасаввур кунем, ки ба шумо лозим аст, ки 5 сутуни баландии гуногунро бо тартиби афзоиш ҷудо кунед. Ин сутунҳо метавонанд ҳар гуна маълумотро дошта бошанд (нархҳои саҳҳомӣ, фарохмаҷрои канали алоқа ва ғ.); шумо метавонед баъзе versionҳои шахсии ин вазифаро пешниҳод кунед, то он равшантар шавад. Хуб, ҳамчун намуна, мо Интиқомгирандагонро аз рӯи баландӣ ҷудо мекунем:
Татбиқи навъбандии ҳубобӣ дар Java - 2
Баръакси барномаи компютерӣ, ҷудокунӣ барои шумо душвор нахоҳад буд, зеро шумо метавонед тамоми тасвирро бубинед ва фавран фаҳмед, ки кадом қаҳрамон бояд ба куҷо кӯчонида шавад, то бомуваффақият ба анҷом расад. Эҳтимол шумо аллакай тахмин кардаед, ки барои ҷудо кардани ин сохтори додаҳо бо тартиби афзоиш, танҳо ҷойҳои Hulk ва Iron Man иваз кунед:
Татбиқи навъбандии ҳубобӣ дар Java - 3

Иҷро шуд!

Ва ин навъбандиро бомуваффақият анҷом медиҳад. Аммо, компютер, бар хилофи шумо, то андозае аблаҳ аст ва тамоми сохтори маълумотро дар маҷмӯъ намебинад. Барномаи назоратии он метавонад дар як вақт танҳо ду арзишро муқоиса кунад. Барои халли ин масъала ба вай лозим меояд, ки ду ададро дар хотираи худ чойгир карда, бо онхо амалиёти мукоисавй анчом дихад ва баъд ба як чуфт ракамхои дигар гузарад ва то даме ки хамаи маълумотхо тахлил карда шаванд. Аз ин рӯ, ҳар як алгоритми ҷудокунӣ метавонад дар шакли се марҳила хеле содда карда шавад:
  • Ду элементро муқоиса кунед;
  • Яке аз онҳоро иваз кунед ё нусхабардорӣ кунед;
  • Ба унсури навбатӣ гузаред;
Алгоритмҳои гуногун метавонанд ин амалҳоро бо тарзҳои гуногун иҷро кунанд, аммо мо ба баррасии он меравем, ки чӣ тавр навъбандии ҳубобӣ кор мекунад.

Алгоритми ҷудокунии ҳубобӣ

Ҷудобандии ҳубобӣ соддатарин ҳисобида мешавад, аммо пеш аз тавсифи ин алгоритм, биёед тасаввур кунем, ки чӣ гуна шумо интиқомгирандагонро аз рӯи баландӣ ҷудо мекунед, агар шумо метавонистед, ба мисли мошин, танҳо ду қаҳрамонро дар як вақт бо ҳамдигар муқоиса кунед. Эҳтимол, шумо амалҳои зеринро анҷом медиҳед (беҳтаринаш):
  • Шумо ба элементи сифри массиви мо мегузаред (Беваи сиёҳ);
  • Унсури сифрро (Беваи сиёҳ) бо якум (Ҳулк) муқоиса кунед;
  • Агар элемент дар мавқеи сифр баландтар бошад, шумо онҳоро иваз мекунед;
  • Дар акси ҳол, агар элемент дар мавқеи сифр хурдтар бошад, шумо онҳоро дар ҷойҳои худ мегузоред;
  • Ба мавқеъ ба тарафи рост ҳаракат кунед ва муқоисаро такрор кунед (Ҳулкро бо капитан муқоиса кунед)
Татбиқи Bubble Sort дар Java - 4
Пас аз он ки шумо тамоми рӯйхатро дар як гузариш бо чунин алгоритм мегузаред, ҷудокунӣ пурра анҷом намеёбад. Аммо аз тарафи дигар, бузургтарин унсури рӯйхат ба мавқеи рости дур интиқол дода мешавад. Ин ҳамеша рӯй медиҳад, зеро вақте ки шумо элементи калонтаринро пайдо мекунед, шумо ҳамеша ҷойҳоро иваз мекунед, то он даме, ки онро ба охир расонед. Яъне, вақте ки барнома Ҳулкро дар массив "пайдо мекунад", вай ӯро ба охири рӯйхат мебарад:
Татбиқи навъҳои ҳубобӣ дар Java - 5
Аз ин рӯ, ин алгоритмро навъбандии ҳубобӣ меноманд, зеро дар натиҷаи кори он бузургтарин элементи рӯйхат дар қисми болоии массив ҷойгир мешавад ва ҳамаи элементҳои хурдтар як мавқеъ ба тарафи чап кӯчонида мешаванд:
Татбиқи Bubble Sort дар Java - 6
Барои анҷом додани навъбандӣ, ба шумо лозим меояд, ки ба аввали массив баргардед ва панҷ қадами дар боло тавсифшударо бори дигар такрор кунед, боз аз чап ба рост ҳаракат кунед, унсурҳоро дар ҳолати зарурӣ муқоиса ва ҳаракат кунед. Аммо ин дафъа ба шумо лозим аст, ки алгоритмро як элемент пеш аз анҷоми массив қатъ кунед, зеро мо аллакай медонем, ки элементи калонтарин (Hulk) комилан дар мавқеи росттарин қарор дорад:
Татбиқи навъҳои ҳубобӣ дар Java - 7
Пас, барнома бояд ду ҳалқа дошта бошад. Барои возеҳи бештар, пеш аз он ки мо ба баррасии codeи барнома гузарем, шумо метавонед дар ин истино визуалии кор кардани навъбандии ҳубобро бубинед: Визуалии он ки чӣ тавр навъбандии ҳубобӣ кор мекунад

Амалисозии навъбандии ҳубобӣ дар Java

Барои нишон додани он ки чӣ тавр ҷудокунӣ дар Java кор мекунад, ин рамзи барнома аст:
  • массиви 5 элементро месозад;
  • болоравии интиқомгирандагонро ба он бор мекунад;
  • мундариҷаи массивро нишон медиҳад;
  • навъбандии ҳубобро амалӣ мекунад;
  • массиви мураттабшударо аз нав намоиш медихад.
Шумо метавонед codeро дар зер бинед ва ҳатто онро ба IDE IntelliJ дӯстдоштаи худ зеркашӣ кунед . Он дар зер таҳлил карда мешавад:
class ArrayBubble{
    private long[] a;   // array reference
    private int elems;  //number of elements in the array

    public ArrayBubble(int max){    //class constructor
        a = new long[max];          //create an array with size max
        elems = 0;                  //when created, the array contains 0 elements
    }

    public void into(long value){   // method for inserting an element into an array
        a[elems] = value;           //insert value into array a
        elems++;                    //array size increases
    }

    public void printer(){          // method for outputting an array to the console
        for (int i = 0; i < elems; i++){    //for each element in the array
            System.out.print(a[i] + " ");   // output to console
            System.out.println("");         //a new line
        }
        System.out.println("----End array output----");
    }

    private void toSwap(int first, int second){ //method swaps a pair of array numbers
        long dummy = a[first];      // put the first element into a temporary variable
        a[first] = a[second];       // put the second element in place of the first
        a[second] = dummy;          //instead of the second element, write the first from temporary memory
    }

    public void bubbleSorter(){     //МЕТОД ПУЗЫРЬКОВОЙ СОРТИРОВКИ
        for (int out = elems - 1; out >= 1; out--){  //Outer loop
            for (int in = 0; in < out; in++){       //Inner loop
                if(a[in] > a[in + 1])               //If the order of the elements is wrong
                    toSwap(in, in + 1);             // call the swapping method
            }
        }
    }
}

public class Main {
    public static void main(String[] args) {
        ArrayBubble array = new ArrayBubble(5); //Create array array with 5 elements

        array.into(163);       //fill the array
        array.into(300);
        array.into(184);
        array.into(191);
        array.into(174);

        array.printer();            //display elements before sorting
        array.bubbleSorter();       //ИСПОЛЬЗУЕМ ПУЗЫРЬКОВУЮ СОРТИРОВКУ
        array.printer();            // print the sorted list again
    }
}
Сарфи назар аз шарҳҳои муфассал дар code, мо тавсифи баъзе усулҳои дар барнома пешниҳодшударо пешниҳод мекунем. Усулҳои асосӣ, ки кори асосиро дар барнома иҷро мекунанд, дар синфи ArrayBubble навишта шудаанд. Синф конструктор ва якчанд усулҳоро дар бар мегирад:
  • into– усули ворид кардани элементҳо ба массив;
  • printer– мундариҷаи массивро сатр ба сатр нишон медиҳад;
  • toSwap- агар лозим бошад, элементҳоро аз нав танзим мекунад. Барои ин таѓйирёбандаи муваќќатї истифода мешавад dummy, ки ба он ќимати адади аввал навишта мешавад ва ба љои адади аввал ќимати адади дуюм навишта мешавад. Пас аз он мундариҷаи тағирёбандаи муваққатӣ ба рақами дуюм навишта мешавад. Ин як усули стандартӣ барои иваз кардани ду элемент аст;

    ва ниҳоят усули асосӣ:

  • bubbleSorter- ки кори асосиро иҷро мекунад ва маълумоти дар массив нигоҳ дошташударо ба навъҳо ҷудо мекунад, мо онро бори дигар алоҳида пешниҳод мекунем:

    public void bubbleSorter(){     //МЕТОД ПУЗЫРЬКОВОЙ СОРТИРОВКИ
        for (int out = elems - 1; out >= 1; out--){  //Outer loop
            for (int in = 0; in < out; in++){       //Inner loop
                if(a[in] > a[in + 1])               //If the order of the elements is wrong
                    toSwap(in, in + 1);             // call the swapping method
            }
        }
    }
Дар ин ҷо шумо бояд ба ду ҳисобкунак диққат диҳед: беруна outва дохилӣ in. Ҳисобкунаки берунаout ба шумориши арзишҳо аз охири массив оғоз мекунад ва бо ҳар як гузариш тадриҷан як маротиба кам мешавад. outБо ҳар як гузариш нав, тағирёбанда ба тарафи чап ҳаракат карда мешавад, то ба арзишҳои аллакай дар тарафи рости массив мураттабшуда таъсир нарасонад. Ҳисобкунаки дохилӣin ба шумориши арзишҳо аз аввали массив оғоз мекунад ва дар ҳар як гузариш тадриҷан як маротиба зиёд мешавад. Афзоиш inто расидани он out(элементи охирини таҳлилшуда дар гузариш ҷорӣ) рух медиҳад. Давраи дохилӣ inду ҳуҷайраи ҳамсояро муқоиса мекунад inва in+1. Агар inадади калонтар аз in+1, нигоҳ дошта шавад, он гоҳ усул номида мешавад toSwap, ки ҷойҳои ин ду ададро иваз мекунад.

Хулоса

Алгоритми навъбандии ҳубобӣ яке аз сусттаринҳост. Агар массив аз N элемент иборат бошад, пас муқоисаи N-1 дар гузариши аввал, N-2 дар дуюм, баъд N-3 ва ғайра анҷом дода мешавад. Яъне, шумораи умумии гузаришҳо анҷом дода мешавад: (N-1) + (N-2) + (N-3) + … + 1 = N x (N-1)/2 Ҳамин тариқ, ҳангоми ҷудокунӣ, алгоритм тақрибан 0,5x(N ^2) муқоисаро иҷро мекунад. Барои N = 5, шумораи муқоисаҳо тақрибан 10 хоҳад буд, барои N = 10 шумораи муқоисаҳо ба 45 мерасад. Ҳамин тариқ, бо зиёд шудани шумораи элементҳо, мураккабии ҷудокунӣ ба таври назаррас меафзояд:
Татбиқи Bubble Sort дар Java - 8
Ба суръати алгоритм на танҳо аз шумораи гузаришҳо, балки шумораи ивазкунӣ, ки бояд анҷом дода шаванд, таъсир мерасонад. Барои маълумоти тасодуфӣ, шумораи ивазкунӣ ба ҳисоби миёна (N ^ 2) / 4 аст, ки тақрибан нисфи шумораи гузаришҳоро ташкил медиҳад. Аммо, дар бадтарин ҳолат, шумораи ивазкунӣ низ метавонад N ^ 2 / 2 бошад - ин ҳолат аст, агар маълумот дар аввал бо тартиби баръакс мураттаб карда шавад. Сарфи назар аз он, ки ин як алгоритми ҷудокунии хеле суст аст, донистан ва фаҳмидани он ки чӣ тавр кор мекунад, хеле муҳим аст ва тавре ки дар боло зикр гардид, он барои алгоритмҳои мураккабтар асос аст. Jgd!
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION