Advertisement
thebys

Matrix shaker sort final working

Nov 30th, 2014
257
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. //Domaci ukol 2 - Tomas Biheler - oprava
  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.     //deklarace promennych
  12.     int pocetRadku = 11;
  13.     int pocetSloupcu = 23;
  14.     int celkemCisel = pocetRadku * pocetSloupcu; //pouzijeme abychom vedeli kam az probublavat...
  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.         }
  33.         printf("\n");
  34.     }
  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.  
  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.                     }
  67.                 }
  68.                 if(vnitrniIterace == zpracovatCisel-1) //posledni polozka iterace smerem dolu, zmena smeru
  69.                 {
  70.                     smer = -1;
  71.                 }
  72.             }
  73.             if(smer == -1) //zprava doleva nahoru
  74.             {
  75.                 if(l > 0) //stejny radek
  76.                 {
  77.                     if((matice[k][l]) < matice[k][l-1])
  78.                     {
  79.                         int temp = matice[k][l];
  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.                     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.         else
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement