Rowan-Classes/3rd-Semester-Fall-2022/PDS/Homework02/HW02_Aidan_Sharpe.cpp
2024-02-22 14:26:13 -05:00

140 lines
4.5 KiB
C++
Executable File

/****************************************************************
* Name: Aidan Sharpe
* Course: Principles of Data Structures
* Class: CS04225
* Assignment Date: September 23, 2022
* File Name: HW02_Aidan_Sharpe.cpp
*****************************************************************
* ID: Homework 2 Problem 1
* Purpose: Sort and search through a vector of ints
*****************************************************************/
#include <iostream>
#include <vector>
/// @brief Sort an incoming vector via selection sort
/// @param vals Vector of random integers
/// @return Original values sorted in ascending order
std::vector<int> vectorSelectionSort(std::vector<int> vals);
/// @brief Find val in vals with linear search
/// @param val number to find
/// @param vals ints to look through
/// @return {index, # of comparisons}
std::vector<int> vecIntLinearSearch(int val, std::vector<int> vals);
/// @brief Find val in vals with binary search
/// @param val number to find
/// @param vals ints to look through
/// @return {index, # of comparisons}
std::vector<int> vecIntBinarySearch(int val, std::vector<int> vals);
/// @brief print a vector of ints
/// @param vals vector to print
/// @param isSorted whether or not the vector is known to be sorted
void printVecInt(std::vector<int> vals, bool isSorted);
int main()
{
std::vector<int> vals{
8284, 4663, 5670, 2284, 1197,
9109, 6547, 7652, 7925, 2421,
8717, 6976, 1671, 5533, 1170,
1112, 4921, 9702, 4177, 9821,
2454, 3211, 5594, 2417, 7294
};
printVecInt(vals, false);
vals = vectorSelectionSort(vals);
printVecInt(vals, true);
int sel;
std::cout << "Query a number:\n";
std::cin >> sel;
std::vector<int> linearS = vecIntLinearSearch(sel, vals);
if (linearS[0] >= 0)
std::cout << "Value " << sel << " was found with linear search at index " << linearS[0] << " with " << linearS[1]<< " comparisons.\n";
else
std::cout << "Linear search could not find " << sel << " after " << linearS[1] << " comparisons\n";
std::vector<int> binaryS = vecIntBinarySearch(sel, vals);
if (binaryS[0] >= 0)
std::cout << "Value " << sel << " was found with binary search at index " << binaryS[0] << " with " << binaryS[1]<< " comparisons.\n";
else
std::cout << "Binary search could not find " << sel << " after " << binaryS[1] << " comparisons\n";
return 0;
}
std::vector<int> vectorSelectionSort(std::vector<int> vals)
{
int temp; // throw-away variable for swapping
int mindex = 0; // index of the smallest number
for (int i = 0; i < vals.size() - 1; i++)
{
mindex = i;
// find index of smallest element
for (int j = i; j < vals.size(); j++)
if (vals[j] < vals[mindex])
mindex = j;
// swap element at i with smallest element
if (mindex > i)
{
temp = vals[mindex];
vals[mindex] = vals[i];
vals[i] = temp;
}
}
return vals;
}
void printVecInt(std::vector<int> vals, bool isSorted)
{
const int COLS = 5;
std::cout << "Values (" << ((isSorted) ? "" : "un") << "sorted):\n";
for (int i = 0; i < vals.size() / COLS + 1; i++)
{
for (int j = 0; j < COLS && i*COLS + j < vals.size(); j++)
std::cout << vals[i*COLS + j] << ", ";
std::cout << std::endl;
}
}
std::vector<int> vecIntLinearSearch(int val, std::vector<int> vals)
{
for (int i = 0; i < vals.size(); i++)
{
if (val == vals[i])
return std::vector<int>{i, i};
}
return std::vector<int>{-1, (int)vals.size()};
}
std::vector<int> vecIntBinarySearch(int val, std::vector<int> vals)
{
int min = 0, mid = (int)vals.size()/2, max = (int)vals.size() - 1;
bool found = false;
int comps = 0;
while (min != max)
{
comps++;
// short circuit find
if (vals[mid] == val)
return std::vector<int>{mid, comps};
// shrink search space to top half of remaining set
else if (vals[mid] < val)
{
min = mid + 1;
mid = (max + min)/2;
}
// shrink search space to bottom half of remaining set
else
{
max = mid - 1;
mid = (max + min)/2;
}
}
// if val is at the last remaining position, it has been found; else it has been proven to not be in the list
return (vals[mid] == val) ? std::vector<int>{mid, comps} : std::vector<int>{-1, comps};
}