View difference between Paste ID: FTr2Y8dm and 45CG9V3a
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
}