Šodien rakstot kārtējo kodu gabalu nonācu līdz situācijai, kad bija jāsakārto masīvu, vadoties pēc kādas noteiktas tā vērtības. Pirmajā minūtē pat nevarēju iedomāties kā lai to izdara. Protams, pēc vēl minūtes apjukums bija pazudis un kods uztapa. Secināju, ka vajadzētu atkārtot klasiskos algoritmus. Ievadu esmu devis. Tagad pats uzdevums. Jums arī piedāvāju uzrakstīt sortēšanas kodu. Lai būtu interesantāk – visas atbildes tiks turētas moderēšanas režīmā 2 dienas. Tas tā – lai citi nešpiko. Pēc šī laika atbildes aktivizēšu. Interesanti būtu redzēt – vai citi izmantotu to pašu algoritmu kuru es – vai pavisam kaut ko citu. Protams, savus variantus var rakstīt arī tie, kas programmē citās valodās, jo uzsvars ir nevis uz konkrētu valodu, bet algoritmu. Un jā – nav arī jēgas tagad atvērt kādu manuāli un uzrakstīt algoritmu. Rakstiet tā kā varat izdomāt.

Tātad uzdevums. Ir dots masīvs ar nenoteiktu skaitu elementu. Indeksi ir no 0 līdz X, pieaugot pa 1. Vērtības ir masīvi. Šiem vērtību masīviem viens no indeksiem ir ‘value’, savukārt vērtība pie attiecīgā indeksa ir Y. Y ir kaut kāds pozitīvs skaitlis.
Piemērs diviem no iespējamajiem veidojumiem:

$data[0]['value'] = 12;
$data[0]['title'] = 'Some title';
$data[1]['value'] = 43.3;
$data[1]['title'] = 'Some title2';

Masīvu ir jāsakārto tā, lai ['value'] lauki būtu dilstošā secībā. Tātad piemērā $data[0] vērtība ir jāapmaina vietām ar $data[1] vērtību. Pēc sortēšanas nedrīkst būt pazuduši kādi no masīva uzbūves noteikumos iekļautajiem ierobežojumiem. Piemēram, $data masīva indeksiem joprojām jābūt no 0 un pieaugošiem pa 1.

Ja gadījumā galīgi nav skaidrs uzdevums – sakiet par to komentāros – mēģināšu paskaidrot.

Citi raksti par šo vai līdzīgu tēmu

flattr this!


19 Comments

  1. Posted 08.04.2008 at 21:33 | Permalink

    Pitons, jo php nav pa rokai un nav arī simts gadus lietots.
    x = [ {"value": 12, "title":"Some title"}, {"value": 43.3, "title":"Some title2"} ]
    x.sort(lambda a, b: (a["value"] < b["value"]) – (b["value"] < a["value"]))

    Iekš php laikam sākumā izveidotu asociatīvu masīvu, kur atslēgas ir tie “value”, tad ksort un gatavs.

    Ja vien neesi pašreizējs CS students, tad riteni izgudrot nav sevišķi prātīgi, labāk lietot vides jau piedāvātās iespējas.

  2. bubu
    Posted 08.04.2008 at 21:52 | Permalink

    Easy. Tur pat nekādu algoritmu nevajag:
    usort($data, create_function(‘$a,$b’, ‘return $b["value"] – $a["value"];’));

  3. kristaps
    Posted 08.04.2008 at 22:55 | Permalink

    Uzdevumu atrisināju, izmantojot uasort funkciju
    http://paste.php.lv/7145?lang=php

  4. kristaps
    Posted 08.04.2008 at 23:12 | Permalink

    Uzdevumu atrisināju vēlreiz, šoreiz ar quicksort algoritma palīdzību
    http://paste.php.lv/7146?lang=php

  5. kristaps
    Posted 08.04.2008 at 23:20 | Permalink

    Piemirsu vistriviālāko variantu – ar bubble sort algoritma palīdzību
    http://paste.php.lv/7147?lang=php

  6. Posted 08.04.2008 at 23:36 | Permalink

    rakstu bez koda – loģikā, uz sitiena nav, kur notestēt + baigais lauziens.

    Kā darītu es.

    1. ietu cauri masīvam pie viena izveidojot jaunu masīvu, kura key būtu value vērtība, bet saturs – jau iepriekš minētais masīvs ar value un title.

    aptuveni šitā:
    $newArray['43,3'] [1]['value'] = 43,3;
    $newArray['43,3'] [1]['title'] = ‘some title 2′;
    $newArray[12][0][value]=12;
    ……

    tad $newArray sakārtotu pēc atslēgām un beigu beigās atgrieztu veco masīvu.

    Tas tā, ja sapratu pareizi uzdevumu.

  7. Posted 09.04.2008 at 07:41 | Permalink

    Ja es pareizi sapratu, tad iekš PHP pietiktu vienkārši ar http://lv2.php.net/usort funkciju. :) Example #2 ir gandrīz kā tavs uzdevums. :)

  8. Posted 09.04.2008 at 09:17 | Permalink

    Elementārs burbuļsorts :D Es pat necentīšos te atklāt jaunu pasauli :D
    http://en.wikipedia.org/wiki/Bubble_sort

    koko savā blogā raksta par: Stoned.lv – portāls par psihoaktīvām vielām

  9. Posted 10.04.2008 at 02:13 | Permalink

    Sis tacu ir pavisam trivials uzdevums.

    Kas ir

    $data[0]['value'] = 12;
    $data[0]['title'] = 'Some title';

    Tas ir

    $data = Array(0 => Array('value' => 12, 'title' => 'Some title'))

    Tad nu trivialais atrisinajums, izmantojot usort():

    function trivial_sort($a, $b) {
    $aa = $a['value'];
    $bb = $b['value'];
    if ($aa > $bb) return -1;
    else if ($aa < $bb) return 1;
    else return 0;
    }

    usort($data, 'trivial_sort');

    Peteris Krumins savā blogā raksta par: Analyzing Keyword Activity on Coding Horror

  10. Posted 10.04.2008 at 20:39 | Permalink

    Pirmkārt – prieks, ka bija tik daudzas atbildes.
    Pats es attiecīgo uzdevumu atrisināju ar bublesort. Par usort kaut kā niedomājos, bet tas būtu prātīgāks risinājums.

  11. Posted 10.04.2008 at 21:08 | Permalink

    Vah, nokavēju :D sort($data); :)

  12. bubu
    Posted 10.04.2008 at 21:40 | Permalink

    Jebkurš variants, kas neizmanto iebūvētās php funkcijas (XXXsort) ir slikts. Jo tas ir lēns un neefektīvs. php iebūvētās kārtošanas funkcijas ir rakstīts C valodā, turpretī visi jūsu burbuļ/quick/insert/whatever-sorti būs lēnāki, jo būs php baitkods.

    Ir jāzin savas programmēšanas vides standartbiblotēku! Citādi taps slikts kods – gan tādā ziņā, ka ir iespējas ielaist vairāk kļūdas (nekā vienkārši izsaucot iebūvētu funkciju), kā arī tādā ziņā, ka citiem darba kolēģiem tu sagādā vairāk darba (viņiem tā vietā lai izlasītu iebūvētas funkcijas izsaukumu, ir jāvelta laiks un jāiebrauc svešā kodā).

  13. Posted 10.04.2008 at 21:47 | Permalink

    Protams, bubu tev ir 100% taisnība. Pats arī sajutos mazs dumjš iesācējs, kad lasot komentārus pamanīju usort(). It kā agrāk biju attiecīgo lietu izmantojis, bet tā kā jau stipri sen neko tādu nevajadzēja darīt, tad nebija pirmais kas ienāca prātā. Tā ir, ka brīžiem kodēšanas uzdevumi panesās stipri vienveidīgi un primitīvi. Persona sāk ierūsēt.

  14. Posted 11.04.2008 at 00:51 | Permalink

    ja kļūst garlaicīgi, tad tu tur kaut ko haltūrē. Programmēšanas sāls jau ir tas, ka tu noprogrammē vienreiz, lai nebūtu kaut kas ar rociņām jādara vēlreiz. Varbūt jāskatās kādu framework-u un bibliotēku virzienā..

  15. Posted 11.04.2008 at 07:19 | Permalink

    2 cu: man pēdējā laikā nākas labot dažādus sen paša, kā arī citu rakstītus kodus. Kuri strukturāli ir ļoti vienkārši: datu atlase, datu izvade, datu ievietošana. Nekas tāds, kur vajadzētu ļoti saspringt domājot kā to panākt. Savukārt veco lietu labošanā izmantot freimworkus ir nereāli. Taču paralēli dažādiem elementārajiem darbiem tagad cītīgi apgūstu Zend Framework. Nākamo projektu, kuru taisīšu no 0 noteikti taisīšu uz ZF.

  16. mārtiņč
    Posted 11.04.2008 at 21:17 | Permalink

    Pirmais, kas ienāca prātā arī bija usort, vienīgais, ka nāktos atvērt manuāli, lai sev atgādinātu, kā funkciju pielietot.

  17. maa
    Posted 12.04.2008 at 17:03 | Permalink

    Lietojot ZF tu netaisi no 0.

  18. Posted 13.04.2008 at 11:28 | Permalink

    Ar “taisīt no 0″ nebiju domājis “taisīt neizmantojot citu rakstītas lietas”. Bet jauna projekta izveidi nevis kāda veca labošanu.

  19. Standfest
    Posted 25.01.2011 at 03:38 | Permalink

    Uzreiz skaidrs ka var izmantot usort, paskatijos pec shis domas komentaaros – tik tieshaam cilveeki arii taa domaa :) Ljoti biezhi sanaak sorteet shaada tipa masiivus.

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>