From d54497480948c01e588350c5f5aeade8d17e2b17 Mon Sep 17 00:00:00 2001 From: TriantaTV Date: Sat, 11 Feb 2023 19:22:37 -0600 Subject: [PATCH] Updated README.md, fixed merge sort, added checking output with bash script, and added sort arguments --- Makefile | 9 +- README.md | 42 +++++++++ bin/main.out | Bin 59168 -> 69176 bytes build/main.o | Bin 19784 -> 12024 bytes include/sorts.h | 14 ++- src/main.cpp | 5 +- src/sorts.cpp | 181 +++++++++++++++++++++++++++++++------ test/CheckSortedOutputs.sh | 22 +++++ test/SortTimes.txt | 30 ++++++ 9 files changed, 267 insertions(+), 36 deletions(-) create mode 100755 test/CheckSortedOutputs.sh create mode 100644 test/SortTimes.txt diff --git a/Makefile b/Makefile index 3b3ec6b..1d29d69 100644 --- a/Makefile +++ b/Makefile @@ -1,13 +1,18 @@ INC := -I include +STD := -std=c++11 main: compile link compile: - g++ $(INC) -c -o build/main.o src/main.cpp - g++ $(INC) -c -o build/sorts.o src/sorts.cpp + g++ $(INC) $(STD) -c -o build/main.o src/main.cpp + g++ $(INC) $(STD) -c -o build/sorts.o src/sorts.cpp link: g++ -o bin/main.out build/*.o +test: main + bin/main.out -a > test/SortTimes.txt + test/CheckSortedOutputs.sh + clean: rm build/*.o bin/*.out test/OUTPUT/*.txt diff --git a/README.md b/README.md index e69de29..1a3a027 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,42 @@ +# Sorting +A program written to test the time complexity of insertion, merge, and heap sort + +# Author +Gregory Crawford + +# Compiling +Run `make` to compile the project. +Output files get placed into test/SORTED + +# Running +Run `bin/main.out` with chosen arguments to run program + +# Commands +## bin/main.out [-a | -f filename | -d] +Ex: `bin/main.out -f test/PERM/perm15K.txt -s merge` + +# Arguments +## File selection +> -a OR --all +- Runs through all the original files (perm15K.txt - perm150K.txt) + - *EX: bin/main.out -a* +> -f path/to/file.txt OR --filename path/to/file.txt +- Runs a specific file to sort + - *EX: bin/main.out -f perm15K.txt* +> -d OR --default (**default**) +- Runs sort only on the default test file (perm15K.txt) + - *EX: bin/main.out -d* +## Sorting type selection +> -s | --sort-type + - Selects a sort type + - Options: + - insertion + - *EX: bin/main.out -s insertion* + - merge + - *EX: bin/main.out -s merge* + - heap + - *EX: bin/main.out -s heap* + - all (**default**) + - *EX: bin/main.out -s all* + +# Notes diff --git a/bin/main.out b/bin/main.out index 458b47c03f62ff89fc34ee42499ce84167b7ef95..576127a2feb2a0b639247de9748c16a013f600fb 100755 GIT binary patch literal 69176 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 T1~>8Qk8*O(Gb|M>MeY9q7QPLS literal 59168 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 diff --git a/include/sorts.h b/include/sorts.h index 74d531a..0120176 100644 --- a/include/sorts.h +++ b/include/sorts.h @@ -1,6 +1,7 @@ #ifndef SORTS_H #define SORTS_H +#include #include #include @@ -12,15 +13,20 @@ private: std::string filename; int lineCount; std::vector originalWordList; - std::vector newWordList; - SortType currentType; + std::chrono::duration sortTime; public: - Sorter(std::string newFilename); + Sorter(); + std::vector newWordList; + bool defaultOnly, fileGiven, allLists, sortGiven; + SortType currentType; std::string GetFilename(void); void SetFilename(std::string newName); void SetWordList(void); + void SortAll(void); void RunSorts(void); + void __RunSorts__(void); void OutputResult(void); + void PrintSortTime(std::string outputFilename); void PrintToFile(std::string outputFilename); void InsertionSort(void); void MergeSort(void); @@ -29,4 +35,6 @@ public: void HeapSort(void); }; +void CheckArguments(int argc, char* arguments[], Sorter* sortObj); + #endif diff --git a/src/main.cpp b/src/main.cpp index 12920af..d73fb73 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,8 +1,9 @@ #include "sorts.h" -int main(int argc, char** argv) +int main(int argc, char* argv[]) { - Sorter newSort(argv[1]); + Sorter newSort; + CheckArguments(argc, argv, &newSort); newSort.RunSorts(); return 0; } diff --git a/src/sorts.cpp b/src/sorts.cpp index f4b524e..4ee20a9 100644 --- a/src/sorts.cpp +++ b/src/sorts.cpp @@ -1,34 +1,41 @@ #include "sorts.h" -#include +#include #include +#include #include #include -Sorter::Sorter(std::string newFilename) +// Initialization function for Sorter class +Sorter::Sorter() { lineCount = 0; currentType = INSERTION; - SetFilename(newFilename); - SetWordList(); + defaultOnly = 0; + fileGiven = 0; + allLists = 0; + sortGiven = 0; } +// Sets the current filename void Sorter::SetFilename(std::string newName) { this->filename = newName; } +// Returns the current filename std::string Sorter::GetFilename(void) { return this->filename; } +// Sets word list found in file into vector void Sorter::SetWordList(void) { std::string bufferStr; std::ifstream file(this->filename); if (!file.is_open()) { - std::cout << "Failed opening file\n"; + std::cout << "Failed opening file: " << this->filename << '\n'; exit(1); } while (getline(file, bufferStr)) @@ -39,32 +46,81 @@ void Sorter::SetWordList(void) return; } +// Main function for calling all sort categories void Sorter::RunSorts(void) { - newWordList = originalWordList; - InsertionSort(); - OutputResult(); - currentType = MERGE; - newWordList = originalWordList; - MergeSort(); - OutputResult(); - currentType = HEAP; - newWordList = originalWordList; - HeapSort(); - OutputResult(); + if (defaultOnly || fileGiven) + { + SetWordList(); + __RunSorts__(); + } + if (allLists) + SortAll(); + return; } +// Sorts all default files if allLists is set +void Sorter::SortAll(void) +{ + int fileCount = 10; + std::string newFilename; + for (int i = 1; i <= fileCount; i++) + { + lineCount = 0; + newFilename = "test/PERM/perm"; + newFilename += std::to_string(15*i); + newFilename += "K.txt"; + SetFilename(newFilename); + SetWordList(); + __RunSorts__(); + originalWordList.clear(); + } +} + +// Function for starting sort functions +void Sorter::__RunSorts__(void) +{ + if (!sortGiven) + currentType = INSERTION; + if (currentType == INSERTION) + { + newWordList = originalWordList; + InsertionSort(); + OutputResult(); + } + if (!sortGiven) + currentType = MERGE; + if (currentType == MERGE) + { + newWordList = originalWordList; + MergeSort(); + OutputResult(); + } + if (!sortGiven) + currentType = HEAP; + if (currentType == HEAP) + { + newWordList = originalWordList; + HeapSort(); + OutputResult(); + } +} + +// Main function for printing results void Sorter::OutputResult(void) { switch(currentType) { case INSERTION: + PrintSortTime("IS"); PrintToFile("IS"); break; case MERGE: + PrintSortTime("MS"); PrintToFile("MS"); break; case HEAP: + PrintSortTime("HS"); PrintToFile("HS"); break; default: @@ -72,12 +128,21 @@ void Sorter::OutputResult(void) } } +// Prints sort time to the screen +void Sorter::PrintSortTime(std::string outputFilename) +{ + std::string sortSizeString = std::to_string(lineCount / 1000); + std::cout << outputFilename << sortSizeString; + std::cout << " took " << sortTime.count() << " s" << std::endl; + return; +} + +// Prints result of sort operation to file void Sorter::PrintToFile(std::string outputFilename) { + std::string sortSizeString = std::to_string(lineCount / 1000); std::string outputPath = "test/OUTPUT/"; - outputPath += outputFilename; - outputPath += std::to_string(lineCount / 1000); - outputPath += "K.txt"; + outputPath += outputFilename + sortSizeString + "K.txt"; std::ofstream file(outputPath); if (!file.is_open()) { @@ -89,8 +154,10 @@ void Sorter::PrintToFile(std::string outputFilename) file.close(); } +// Main function for insertion sort void Sorter::InsertionSort(void) { + auto start = std::chrono::system_clock::now(); int i; std::string key; for (int j = 1; j < lineCount; j++) @@ -104,14 +171,21 @@ void Sorter::InsertionSort(void) } newWordList[i + 1] = key; } + auto end = std::chrono::system_clock::now(); + sortTime = end - start; } +// Main function for merge sort void Sorter::MergeSort(void) { + auto start = std::chrono::system_clock::now(); __MergeSort__(0, lineCount - 1); + auto end = std::chrono::system_clock::now(); + sortTime = end - start; return; } +// Merge sort function child void Sorter::__MergeSort__(int p, int r) { if (p < r) @@ -124,19 +198,21 @@ void Sorter::__MergeSort__(int p, int r) return; } +// Merge sort function child void Sorter::__Merge__(int p, int q, int r) { int n1 = q - p + 1; int n2 = r - q; - // L[i - 1] R[j - 1] - std::vector leftTmp; - std::vector rightTmp; + const int leftTmpSize = n1 + 1; + const int rightTmpSize = n2 + 1; + std::string leftTmp[leftTmpSize]; + std::string rightTmp[rightTmpSize]; for (int i = 0; i < n1; i++) - leftTmp.push_back(newWordList[p + i]); + leftTmp[i] = newWordList[p + i]; for (int i = 0; i < n2; i++) - rightTmp.push_back(newWordList[q + i + 1]); - leftTmp.push_back("ZZZZZ"); - rightTmp.push_back("ZZZZZ"); + rightTmp[i] = newWordList[q + i + 1]; + leftTmp[n1] = "ZZZZZ"; + rightTmp[n2] = "ZZZZZ"; int i = 0; int j = 0; for (int k = p; k <= r; k++) @@ -145,16 +221,63 @@ void Sorter::__Merge__(int p, int q, int r) { newWordList[k] = leftTmp[i]; i++; - } - else - { + } else { newWordList[k] = rightTmp[j]; j++; } } } +// Main function for heap sort void Sorter::HeapSort(void) { + auto start = std::chrono::system_clock::now(); ; + auto end = std::chrono::system_clock::now(); + sortTime = end - start; +} + +// Checks for command line arguments +void CheckArguments(int argc, char* arguments[], Sorter* sortObj) +{ + std::string tempStr; + for (int i = 0; i < argc; i++) + { + tempStr = arguments[i]; + if ((tempStr == "-a") || (tempStr == "--all")) + { + sortObj->allLists = 1; + return; + + } + if ((tempStr == "-f") || (tempStr == "--filename")) + { + sortObj->SetFilename(arguments[i + 1]); + sortObj->fileGiven = 1; + return; + } + if ((tempStr == "-d") || (tempStr == "--default")) + { + sortObj->SetFilename("test/PERM/perm15K.txt"); + sortObj->defaultOnly = 1; + return; + } + if ((tempStr == "-s") || (tempStr == "--sort-type")) + { + sortObj->sortGiven = 1; + tempStr = arguments[i + 1]; + std::cout << tempStr << '\n'; + if (tempStr == "insertion") + sortObj->currentType = INSERTION; + if (tempStr == "merge") + sortObj->currentType = MERGE; + if (tempStr == "heap") + sortObj->currentType = HEAP; + if (tempStr == "all") + sortObj->sortGiven = 0; + } + } + sortObj->SetFilename("test/PERM/perm15K.txt"); + sortObj->defaultOnly = 1; + return; } diff --git a/test/CheckSortedOutputs.sh b/test/CheckSortedOutputs.sh new file mode 100755 index 0000000..5d22feb --- /dev/null +++ b/test/CheckSortedOutputs.sh @@ -0,0 +1,22 @@ +#!/bin/bash +for ((i=1;i<=10;i++));do + diff -w test/OUTPUT/IS$((i*15))K.txt test/SORTED/sorted$((i*15))K.txt &>/dev/null + if [[ $? -eq 0 ]]; then + echo "IS$((i*15))K passed" + else + echo "IS$((i*15))K failed" + fi + diff -w test/OUTPUT/MS$((i*15))K.txt test/SORTED/sorted$((i*15))K.txt &>/dev/null + if [[ $? -eq 0 ]]; then + echo "MS$((i*15))K passed" + else + echo "MS$((i*15))K failed" + fi + diff -w test/OUTPUT/HS$((i*15))K.txt test/SORTED/sorted$((i*15))K.txt &>/dev/null + if [[ $? -eq 0 ]]; then + echo "HS$((i*15))K passed" + else + echo "HS$((i*15))K failed" + fi + echo "" +done \ No newline at end of file diff --git a/test/SortTimes.txt b/test/SortTimes.txt new file mode 100644 index 0000000..1453cc2 --- /dev/null +++ b/test/SortTimes.txt @@ -0,0 +1,30 @@ +IS15 took 2.06461 s +MS15 took 0.0154898 s +HS15 took 5.4e-08 s +IS30 took 8.38467 s +MS30 took 0.0324445 s +HS30 took 7.2e-08 s +IS45 took 18.9657 s +MS45 took 0.0506499 s +HS45 took 5.3e-08 s +IS60 took 34.2814 s +MS60 took 0.069865 s +HS60 took 4.7e-08 s +IS75 took 54.3642 s +MS75 took 0.0892599 s +HS75 took 6.4e-08 s +IS90 took 80.1745 s +MS90 took 0.110413 s +HS90 took 6e-08 s +IS105 took 111.424 s +MS105 took 0.130451 s +HS105 took 6.8e-08 s +IS120 took 149.645 s +MS120 took 0.15206 s +HS120 took 5.7e-08 s +IS135 took 196.821 s +MS135 took 0.169646 s +HS135 took 6.4e-08 s +IS150 took 250.343 s +MS150 took 0.194482 s +HS150 took 1.18e-07 s