#include "stdafx.h" #include // biblioteka potrzebna do zliczania cykli procesora #include #include /* Opis bardziej szczegolowy ponizszego programu : - funkcja main programu odpowiada tylko i wylacznie za uruchomienie poszczegolnych funkcji sortowania oraz wyswietlenie informacji o czasie ich wykonania - poszczegolne funkcje sortujace wykonuja nastepujace dzialania : - wczytuja plik z danymi wejsciowymi (input.txt), jesli nie istnieje, wywalaja blad - tworza WLASNA, LOKALNA tablice danych wejsciowych i sortuja je wedlug odpowiednich algorytmow (opisane w poszczegolnych funkcjach) - zapisuja plik z posortowanymi danymi do pliku o rozszerzeniu .txt i nazwie odpowiedniej do stosowanego algorytmu - zamykaja otwarte pliki i zwalniaja zajeta pamiec Na pewno nie jest to najlepszy program z tych przyslanych do Pana, pewnie nie jest nawet dobry - w koncu jest proporcjonalny do moich umiejetnosci, ale jestem z niego dumny, bo zajal mi niemalo czasu i dziala jak nalezy. ;) -D.K. */ // std::swap jest beznadziejne unsigned __int64 BubbleSort() { FILE * dane_bubblesort; // tworzymy zmienna plikowa, do ktorej zostana wczytane dane do posortowania dane_bubblesort=fopen("input.txt","r"); // otwieramy plik z danymi if(dane_bubblesort==NULL) // jesli plik nie istnieje, wywalamy komunikat i konczymy program { printf("Blad pliku."); exit; } int *tablica_bubblesort; // tworzymy wskaznik na tablice tablica_bubblesort=(int*)malloc(99999*sizeof(int)); // alokujemy pamiec dla tablicy if(tablica_bubblesort==NULL) // jesli nie udalo sie zaalokowac pamieci, wywalamy komunikat i konczymy program { printf("Blad pamieci."); exit; } for(int i=0;i<99999;i++) // wypelniamy tablice danymi wczytanymi z pliku { fscanf(dane_bubblesort,"%d\n",&tablica_bubblesort[i]); } fclose(dane_bubblesort); // zamykamy plik i zapominamy o nim int buf=0; // tworzymy zmienna pomocnicza dla algorytmu sortujacego (w tym przypadku bufor do przenoszenia danych) unsigned __int64 przed_bubblesort; // tworzymy zmienna sluzaca do pomiaru ilosci cykli procesora przed_bubblesort=__rdtsc(); // przypisujemy utworzonej zmiennej wartosc odpowiadajaca ilosci cykli przed rozpoczeciem algorytmu sortujacego for(int i=0;i<99999;i++) // implementacja sortowania babelkowego - startujemy petle sprawdzajaca kazdy element tablicy { for(int j=99998;j>=i;j--) /* startujemy druga petle (dekrementacyjna, bo tak latwiej jest zamieniac wyrazy w tablicy), ktora sprawdza wszystkie elementy petli oprocz tych juz sprawdzonych (stad warunek kontynuowania : j>=i) */ { if(tablica_bubblesort[j-1]>tablica_bubblesort[j]) // porownujemy kazde kolejne dwa sasiadujace wyrazy { // i jesli jest spelniony warunek, ze jeden z nich jest wiekszy, zamieniamy je miejscami buf=tablica_bubblesort[j-1]; tablica_bubblesort[j-1]=tablica_bubblesort[j]; tablica_bubblesort[j]=buf; } } } unsigned __int64 po_bubblesort; // tworzymy zmienna, w ktorej zostanie zapisana ilosc cykli procesora po wykonaniu algorytmu sortujacego po_bubblesort=__rdtsc(); // do przed chwila utworzonej zmiennej przypisujemy wartosc odpowiadajaca ilosci cykli procesora FILE * bubblesort; // tworzymy zmienna plikowa, do ktorej zapiszemy wyniki sortowania bubblesort=fopen("bubblesort.txt","w"); // otwieramy plik do zapisu wynikow w trybie write if(bubblesort==NULL) // jesli pliku nie udalo sie otworzyc (co w sumie byloby dziwne), wywalamy komunikat i konczymy program { printf("Blad pliku."); exit; } for(int i=0;i<99999;i++) // wypelniamy plik wartosciami z posortowanej juz tablicy { fprintf(bubblesort,"%d\n",tablica_bubblesort[i]); } fclose(bubblesort); // zamykamy plik z wynikami i zapominamy o nim free(tablica_bubblesort); // zwalniamy pamiec zajeta przez tablice z wynikami return (po_bubblesort-przed_bubblesort); // jako wartosc zwracana przez funkcje zwracamy ilosc cykli potrzebnych do wykonania algorytmu sortujacego } unsigned __int64 InsertSort() { /* wiele z instrukcji napotkanych tutaj jest analogiczna do tych z poprzedniej funkcji, tak wiec komentowane beda tylko te czesci, ktore sie znacznie roznia - m. in. algorytm sortowania */ FILE * dane_insertsort; dane_insertsort=fopen("input.txt","r"); if(dane_insertsort==NULL) { printf("Blad pliku."); exit; } int *tablica_insertsort; tablica_insertsort=(int*)malloc(99999*sizeof(int)); if(tablica_insertsort==NULL) { printf("Blad pamieci."); exit; } for(int i=0;i<99999;i++) { fscanf(dane_insertsort,"%d\n",&tablica_insertsort[i]); } fclose(dane_insertsort); unsigned __int64 przed_insertsort; int temp,j; /* tworzymy (nie inicjujemy, bo nie ma po co - i tak zaraz zostanie nadpisana) zmienna pomocnicza dla algorytmu sortujacego, w tym przypadku jest to zmienna, do ktorej tymczasowo kopiujemy wartosc z serii danych, ktora w danym momencie uwazamy za najmniejsza oraz licznik do petli zagniezdzonej */ przed_insertsort=__rdtsc(); for(int i=1;i<99999;i++) // implementacja sortowania przez wstawianie { temp=tablica_insertsort[i]; // wybieramy dowolny element ze zbioru nieuporzadkowanego (w tym przypadku jest to drugi element) for(j=i-1;(j>=0) && (tablica_insertsort[j]>temp);j--) // porownujemy go z kolejnymi elementami zbioru nieuporzadkowanego { tablica_insertsort[j+1]=tablica_insertsort[j]; /* i wstawiamy w kolejne miejsca tablicy uporzadkowanej, dopoki nie sa one wieksze od wartosci wybranej przez poprzednia petle */ } tablica_insertsort[j+1]=temp; // przesuwamy element losowy (czyli najwiekszy z tych, ktore zdazylismy porownac) w gore zbioru } unsigned __int64 po_insertsort; po_insertsort=__rdtsc(); FILE * insertsort; insertsort=fopen("insertsort.txt","w"); if(insertsort==NULL) { printf("Blad pliku."); exit; } for(int i=0;i<99999;i++) { fprintf(insertsort,"%d\n",tablica_insertsort[i]); } fclose(insertsort); free(tablica_insertsort); return(po_insertsort-przed_insertsort); } unsigned __int64 ChoiceSort() { FILE * dane_choicesort; dane_choicesort=fopen("input.txt","r"); if(dane_choicesort==NULL) { printf("Blad pliku."); exit; } int *tablica_choicesort; tablica_choicesort=(int*)malloc(99999*sizeof(int)); if(tablica_choicesort==NULL) { printf("Blad pamieci."); exit; } for(int i=0;i<99999;i++) { fscanf(dane_choicesort,"%d\n",&tablica_choicesort[i]); } fclose(dane_choicesort); unsigned __int64 przed_choicesort; int buf=0; // pierwsza ze zmiennych pomocniczych - bufor do zamieniania miejscami wyrazow tablicy int indeks_min; // druga ze zmiennych pomocniczych - indeks wyrazu, ktorego chcemy znalezc (maslo maslane, ale nie wiem jak to inaczej wytlumaczyc) przed_choicesort=__rdtsc(); for(int h=0;h<99999;h++) // implementacja sortowania przez wybor { indeks_min=h; // przypisujemy licznik petli do zmiennej identyfikujacej indeks wyrazu "szukanego" for(int i=h+1;i<99999;i++) // startujemy druga petle, ktora szuka wyrazu na zastapienie wyrazu "szukanego" { if(tablica_choicesort[i]