[Powered by Google Translate] [BUBBLE SORT] [JACKSON STEINKAMP Hārvarda universitāte] [Tas ir CS50. CS50TV] Burbulis Šķirot ir piemērs šķirošanas algoritmu - tas ir, procedūra šķirošanas kompleksu elementu pastāvēšanu augošā vai dilstošā secībā. Piemēram, ja jūs vēlaties, lai sakārtotu masīvu, kas sastāv no numuriem [3, 5, 2, 9], pareiza īstenošana Bubble Kārtot varētu atgriezties sakārtoti masīvs [2, 3, 5, 9] augošā secībā. Tagad es esmu gatavojas izskaidrot pseudocode kā algoritms darbojas. Pieņemsim, ka mēs esam šķirošanas sarakstu no 5 integers - 3, 2, 9, 6, 5 un. Algoritms sākas, aplūkojot pirmajiem diviem elementiem, 3 un 2, un pārbaudīt, ja viņi no rīkojuma attiecībā pret otru. Tie ir - 3 ir lielāks par 2. Lai būtu augošā secībā, tiem vajadzētu būt otrādi. Tātad, mēs mijmaiņas tiem. Tagad saraksts izskatās šādi: [2, 3, 9, 6, 5]. Tālāk, mēs skatāmies uz otro un trešo elementu, 3 un 9. Viņi pareizā secībā attiecībā pret otru. Tas ir, 3 ir mazāks par 9 tāpēc algoritms nav mijmaiņas tiem. Tālāk, mēs skatāmies pēc 9 un 6. Viņi no pasūtījuma. Tātad, mums ir nepieciešams, lai mijmaiņas tiem, jo ​​9 ir lielāks par 6. Visbeidzot, mēs skatāmies pēdējos divos integers, 9 un 5. Viņi iziet no ierindas, tāpēc tie ir samainīti. Pēc pirmās pilnās iziet cauri sarakstam, tas izskatās šādi: [2, 3, 6, 5, 9]. Nav slikti. Tas ir gandrīz sakārtoti. Bet mums ir nepieciešams, lai palaistu cauri sarakstam vēlreiz, lai saņemtu to pilnībā sakārtots. Divi ir mazāks par 3, tāpēc mums nav mijmaiņas tiem. Trīs ir mazāks par 6, tāpēc mums nav mijmaiņas tiem. Seši ir lielāks par 5. Mēs nomainīju. Seši ir mazāks par 9. Mums nav swap. Pēc otrā iziet cauri, tas izskatās šādi: [2, 3, 5, 6, 9]. Perfekta. Tagad, pieņemsim uzrakstiet to pseudocode. Būtībā, katram elementam sarakstā, mums ir jāskatās uz to un elementa tieši tās tiesībām. Ja tie nav pareizā secībā attiecībā pret otru - tas ir, ja elements pa kreisi ir lielāks nekā tas, pa labi - mums vajadzētu mijmaiņas diviem elementiem. Mēs to darām, lai katru elementu sarakstu, un mēs esam padarījuši vienu iet cauri. Tagad mums vienkārši ir jādara transmisija pietiekami laikus, lai nodrošinātu sarakstu ir pilnībā, pareizi sakārtots. Bet cik reizes mums ir iziet cauri sarakstam, lai garantēt, ka mēs esam darījuši? Nu, sliktākajā gadījumā ir, ja mums ir pilnīgi atpakaļsaderību sarakstu. Tad tas aizņem vairākus iet pievadiem vienāds skaits elementu n-1. Ja tas nav jēgas intuitīvi, domā par vienkāršu lietu - sarakstu [2, 1]. Tas ir gatavojas veikt vienu transmisija sakārtot pareizi. [3, 2, 1] - Sliktākajā gadījumā ir tas, ka ar 3 elementiem sakārtoti atpakaļ, tas gatavojas veikt 2 atkārtojumiem kārtošanai. Pēc viena atkārtojuma, tā [2, 1, 3]. Otrais ražas sakārtoti masīvs [1, 2, 3]. Tātad, jūs zināt, jums nekad nav iet caur masīvs, kopumā vairāk nekā n-1 reizes, kur n ir elementu skaits masīvā. To sauc burbulis Sakārtot jo lielākie elementi mēdz "burbulis-up" uz labo diezgan ātri. Patiesībā, šis algoritms ir ļoti interesants uzvedību. Pēc m atkārtojumiem cauri visai masīvs, rightmost m elementi ir garantēta sakārtoti savā pareizajā vietā. Ja jūs vēlaties redzēt šo par sevi, mēs varam mēģināt to par pilnīgi atpakaļsaderību sarakstā [9, 6, 5, 3, 2]. Pēc viena iet caur visam sarakstam, [Skaņu rakstīšanas] [6, 9, 5, 3, 2], [6, 5, 9, 3, 2], [6, 5, 3, 9, 2], [6, 5, 3, 2, 9] rightmost elements 9 ir tās pienācīgu vietu. Pēc otrā transmisija, 6 būs "burbuļo-up" uz 2. rightmost vieta. Divi elementi pa labi - 6 un 9 - būs savās pareizajās vietās Pēc pirmo divu pass pievadiem. Tātad, kā mēs varam izmantot, lai optimizētu šo algoritmu? Nu, pēc viena atkārtojuma caur masīvs mums nav tiešām ir nepieciešams, lai pārbaudītu rightmost elements jo mēs zinām, tas ir sakārtoti. Pēc diviem atkārtojumiem, mēs zinām droši rightmost divi elementi ir savā vietā. Tātad, kopumā, pēc k iterācijām caur pilnu klāstu, Pārbaudot pēdējo k elementiem ir lieks, jo mēs zinām, viņi ir pareizajā vietā jau. Tātad, ja jūs esat šķirošanu masīvs n elementiem, gada pirmā atkārtojuma - you'll ir kārtot visus elementus - pirmā N-0. Gada otrajam atkārtojumam, jums ir apskatīt visus elementus, bet pēdējo - pirmais N-1. Vēl optimizācija varētu pārbaudīt, ja saraksts jau ir sakārtots Pēc katras iterācijas. Ja tas jau ir sakārtoti, mums nav nepieciešams veikt vairāk iterācijas pa sarakstu. Kā mēs varam darīt? Nu, ja mums nav nekādas mijmaiņa uz transmisija saraksta, tas ir skaidrs, ka saraksts jau tika sakārtots, jo mums nav mijmaiņas neko. Tāpēc mēs noteikti nav šķirot vēlreiz. Varbūt jūs varētu inicializēt karoga mainīgo sauc "nav sakārtoti", lai nepatiess un mainīt to, ja jums ir, lai mijmaiņas kādi elementus viena atkārtojuma caur masīvs. Vai līdzīgi, lai skaitītājs cik mijmaiņas jūs veicat jebkurā konkrētā atkārtojuma. Pēc atkārtošanu, ja Jums nav mijmaiņas jebkuru no elementiem, Jūs zināt saraksts jau ir sakārtots, un jūs darīts. Burbulis Kārtot, tāpat kā citi kārtošanas algoritmi, var būt tweaked strādāt visiem elementiem, kuriem ir pasūtīšanas metodi. Tas ir, ņemot vērā divi elementi jums ir veids, kā pateikt, ja pirmais ir lielāks nekā, vienāda vai mazāka nekā otrajā. Piemēram, jūs varētu kārtot alfabēta burti, sakot ka