SHOW:
|
|
- or go back to the newest paste.
| 1 | #include <stdio.h> | |
| 2 | #include <stdlib.h> | |
| 3 | - | //Koktejlove razeni matice matice |
| 3 | + | //Domaci ukol 2 - Tomas Biheler - oprava |
| 4 | - | //Neni to zatim dodelane uplne podle zadani ale už to aspon (neefektivne) funguje. |
| 4 | + | //Koktejlove razeni matice. |
| 5 | //pouziva jeden vnejsi a jeden vnitrni cyklus. | |
| 6 | //neprobublava setridene casti matice. | |
| 7 | ||
| 8 | //Celkovy cas straveny resenim - cca. 6 hodin. | |
| 9 | int main() | |
| 10 | {
| |
| 11 | - | int zpracovatCisel = celkemCisel; |
| 11 | + | |
| 12 | int pocetRadku = 11; | |
| 13 | - | int matice[pocetRadku][pocetSloupcu]; |
| 13 | + | |
| 14 | - | int vnejsiIterace; |
| 14 | + | |
| 15 | - | int vnitrniIterace; |
| 15 | + | int zpracovatCisel = celkemCisel; //pracovni hodnota, ktera se postupne zmensuje s tim, jak je matice serazenejsi... |
| 16 | int smer = 1; //1 = dolu; -1 = nahoru; | |
| 17 | int matice[pocetRadku][pocetSloupcu]; //jedna matice, dle zadani | |
| 18 | int vnejsiIterace = 0; //dokud neni serazeno | |
| 19 | int vnitrniIterace; //probublavani | |
| 20 | srand(time(NULL)); | |
| 21 | ||
| 22 | int serazeno = 0; | |
| 23 | ||
| 24 | //naplnìní matice a jeji vypis | |
| 25 | printf("\nNahodne vygenerovana matice:\n\n");
| |
| 26 | for(int i = 0; i < pocetRadku; ++i) | |
| 27 | {
| |
| 28 | for(int j = 0; j < pocetSloupcu; ++j) | |
| 29 | {
| |
| 30 | matice[i][j] = rand() % 100; | |
| 31 | printf("%02i ", matice[i][j]);
| |
| 32 | - | while(serazeno == 0) |
| 32 | + | |
| 33 | printf("\n");
| |
| 34 | } | |
| 35 | - | for(vnitrniIterace = 0; vnitrniIterace < zpracovatCisel; vnitrniIterace += smer) |
| 35 | + | |
| 36 | //serazeni matice | |
| 37 | while(serazeno == 0) //jeden vnejsi cyklus | |
| 38 | {
| |
| 39 | int nastaloPrehozeni = 0; | |
| 40 | for(vnitrniIterace = celkemCisel - zpracovatCisel; vnitrniIterace < zpracovatCisel; vnitrniIterace += smer) //jeden vnitrni cyklus | |
| 41 | {
| |
| 42 | int k = vnitrniIterace / pocetSloupcu; //sloupcova pozice | |
| 43 | int l = vnitrniIterace % pocetSloupcu; //radkova pozice | |
| 44 | - | //printf("sort P:%02i:%02i - V: %02i, R: %i\n", k, l, matice[k][l], zpracovatCisel);
|
| 44 | + | |
| 45 | ||
| 46 | if(smer == 1) //zleva doprava dolu... | |
| 47 | {
| |
| 48 | if(l < pocetSloupcu-1) //stejny radek | |
| 49 | {
| |
| 50 | if((matice[k][l]) > matice[k][l+1]) | |
| 51 | {
| |
| 52 | int temp = matice[k][l]; | |
| 53 | matice[k][l] = matice[k][l+1]; | |
| 54 | matice[k][l+1] = temp; | |
| 55 | nastaloPrehozeni = 1; | |
| 56 | } | |
| 57 | } | |
| 58 | if(k < pocetRadku-1 && l == pocetSloupcu -1) //posledni polozka neposledniho radku | |
| 59 | {
| |
| 60 | if((matice[k][l]) > matice[k+1][0]) //posledni polozka aktualniho radku s prvni polozkou nasledujiciho | |
| 61 | {
| |
| 62 | int temp = matice[k][l]; | |
| 63 | matice[k][l] = matice[k+1][0]; | |
| 64 | matice[k+1][0] = temp; | |
| 65 | nastaloPrehozeni = 1; | |
| 66 | - | if(k == pocetRadku-1 && l == pocetSloupcu-1) |
| 66 | + | |
| 67 | } | |
| 68 | - | //posledni polozka iterace, zmena smeru |
| 68 | + | if(vnitrniIterace == zpracovatCisel-1) //posledni polozka iterace smerem dolu, zmena smeru |
| 69 | - | break; |
| 69 | + | |
| 70 | smer = -1; | |
| 71 | } | |
| 72 | - | if(smer == -1) |
| 72 | + | |
| 73 | if(smer == -1) //zprava doleva nahoru | |
| 74 | {
| |
| 75 | if(l > 0) //stejny radek | |
| 76 | - | if(k == pocetRadku-1 && l == pocetSloupcu-1) |
| 76 | + | |
| 77 | if((matice[k][l]) < matice[k][l-1]) | |
| 78 | - | //posledni polozka iterace |
| 78 | + | |
| 79 | - | break; |
| 79 | + | |
| 80 | matice[k][l] = matice[k][l-1]; | |
| 81 | matice[k][l-1] = temp; | |
| 82 | nastaloPrehozeni = 1; | |
| 83 | } | |
| 84 | } | |
| 85 | if(l == 0 && k > 0) //prvni polozka neprvniho radku | |
| 86 | {
| |
| 87 | if((matice[k][l]) < matice[k-1][pocetSloupcu-1]) //posledni polozka aktualniho radku s prvni polozkou nasledujiciho | |
| 88 | {
| |
| 89 | int temp = matice[k][l]; | |
| 90 | matice[k][l] = matice[k-1][pocetSloupcu-1]; | |
| 91 | matice[k-1][pocetSloupcu-1] = temp; | |
| 92 | nastaloPrehozeni = 1; | |
| 93 | } | |
| 94 | } | |
| 95 | if(vnitrniIterace == 0 && smer == -1) //posledni polozka iterace smerem nahoru, konec iterace | |
| 96 | {
| |
| 97 | //zpatky u prvni polozky | |
| 98 | smer = 1; | |
| 99 | - | //printf("\nVnitrnich iteraci: %i", vnitrniIterace); //dukaz, ze to neprobublava celou matici
|
| 99 | + | break; //ukonci iteraci a zacne novou |
| 100 | } | |
| 101 | } | |
| 102 | if( matice[k][l] > 100) //nekde to preteklo a tohle se da pouzit na zjisteni daneho mista | |
| 103 | {
| |
| 104 | printf("val err P:%02i:%02i - V: %02i\n", k, l, matice[k][l]);
| |
| 105 | } | |
| 106 | } | |
| 107 | ++vnejsiIterace; | |
| 108 | --zpracovatCisel; //omezení bublani serazenou casti matice | |
| 109 | ||
| 110 | if(nastaloPrehozeni == 1) | |
| 111 | {
| |
| 112 | continue; | |
| 113 | } | |
| 114 | - | printf("\n\nserazeno v %i iteracich:\n", vnejsiIterace);
|
| 114 | + | |
| 115 | {
| |
| 116 | serazeno = 1; | |
| 117 | } | |
| 118 | } | |
| 119 | ||
| 120 | //vypis serazene matice | |
| 121 | printf("\n\nserazeno shaker/cocktail sortem v %i iteracich (vnejsiho cyklu):\n\n", vnejsiIterace);
| |
| 122 | for(int i = 0; i < pocetRadku; ++i) | |
| 123 | {
| |
| 124 | for(int j = 0; j < pocetSloupcu; ++j) | |
| 125 | {
| |
| 126 | printf("%02i ", matice[i][j]);
| |
| 127 | } | |
| 128 | printf("\n");
| |
| 129 | } | |
| 130 | ||
| 131 | return 0; | |
| 132 | } |