//Devin Scheu CS1A Chapter 8, P. 488, #8
//
/**************************************************************
*
* BENCHMARK LINEAR AND BINARY SEARCH COMPARISONS
* ____________________________________________________________
* This program determines the number of comparisons made by
* linear search and binary search to locate a value in an array.
* ____________________________________________________________
* INPUT
* searchValue : The value to search for in the array
*
* OUTPUT
* linearComparisons : The number of comparisons for linear search
* binaryComparisons : The number of comparisons for binary search
*
**************************************************************/
#include <iostream>
#include <iomanip>
using namespace std;
// Function for linear search comparisons
int linearSearch(const int arr[], int size, int value) {
int comparisons = 0;
for (int i = 0; i < size; i++) {
comparisons++;
if (arr[i] == value) {
return comparisons;
}
}
return comparisons;
}
// Function for binary search comparisons (array must be sorted)
int binarySearch(const int arr[], int size, int value) {
int comparisons = 0;
int low = 0;
int high = size - 1;
while (low <= high) {
int mid = (low + high) / 2;
comparisons++;
if (arr[mid] == value) {
return comparisons;
} else if (arr[mid] < value) {
low = mid + 1;
} else {
high = mid - 1;
}
}
return comparisons;
}
// Function for selection sort
void selectionSort(int arr[], int size) {
for (int i = 0; i < size - 1; i++) {
int minIndex = i;
for (int j = i + 1; j < size; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
if (minIndex != i) {
int temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
}
}
int main () {
//Variable Declarations
const int ARRAY_SIZE = 20; //OUTPUT - Size of the array
int numbers[ARRAY_SIZE] = {5, 7, 2, 8, 9, 1, 0, 4, 3, 6, 10, 12, 14, 16, 18, 11, 13, 15, 17, 19};
int searchValue; //INPUT - The value to search for in the array
int linearComparisons; //OUTPUT - The number of comparisons for linear search
int binaryComparisons; //OUTPUT - The number of comparisons for binary search
//Prompt for Input
cout << "Enter the value to search for: ";
cin >> searchValue;
cout << searchValue << endl;
//Perform Linear Search
linearComparisons = linearSearch(numbers, ARRAY_SIZE, searchValue);
//Sort the Array for Binary Search
selectionSort(numbers, ARRAY_SIZE);
//Perform Binary Search
binaryComparisons = binarySearch(numbers, ARRAY_SIZE, searchValue);
//Separator and Output Section
cout << "-------------------------------------------------------" << endl;
cout << "OUTPUT:" << endl;
//Output Result
cout << left << setw(25) << "Linear Comparisons:" << right << setw(15) << linearComparisons << endl;
cout << left << setw(25) << "Binary Comparisons:" << right << setw(15) << binaryComparisons << endl;
} //end of main()
Ly9EZXZpbiBTY2hldSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUzFBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcHRlciA4LCBQLiA0ODgsICM4Ci8vCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiogQkVOQ0hNQVJLIExJTkVBUiBBTkQgQklOQVJZIFNFQVJDSCBDT01QQVJJU09OUwoqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoqIFRoaXMgcHJvZ3JhbSBkZXRlcm1pbmVzIHRoZSBudW1iZXIgb2YgY29tcGFyaXNvbnMgbWFkZSBieQoqIGxpbmVhciBzZWFyY2ggYW5kIGJpbmFyeSBzZWFyY2ggdG8gbG9jYXRlIGEgdmFsdWUgaW4gYW4gYXJyYXkuCiogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCiogSU5QVVQKKiBzZWFyY2hWYWx1ZSA6IFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yIGluIHRoZSBhcnJheQoqCiogT1VUUFVUCiogbGluZWFyQ29tcGFyaXNvbnMgOiBUaGUgbnVtYmVyIG9mIGNvbXBhcmlzb25zIGZvciBsaW5lYXIgc2VhcmNoCiogYmluYXJ5Q29tcGFyaXNvbnMgOiBUaGUgbnVtYmVyIG9mIGNvbXBhcmlzb25zIGZvciBiaW5hcnkgc2VhcmNoCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxpb21hbmlwPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCi8vIEZ1bmN0aW9uIGZvciBsaW5lYXIgc2VhcmNoIGNvbXBhcmlzb25zCmludCBsaW5lYXJTZWFyY2goY29uc3QgaW50IGFycltdLCBpbnQgc2l6ZSwgaW50IHZhbHVlKSB7CiAgICBpbnQgY29tcGFyaXNvbnMgPSAwOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKICAgICAgICBjb21wYXJpc29ucysrOwogICAgICAgIGlmIChhcnJbaV0gPT0gdmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmlzb25zOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBjb21wYXJpc29uczsKfQoKLy8gRnVuY3Rpb24gZm9yIGJpbmFyeSBzZWFyY2ggY29tcGFyaXNvbnMgKGFycmF5IG11c3QgYmUgc29ydGVkKQppbnQgYmluYXJ5U2VhcmNoKGNvbnN0IGludCBhcnJbXSwgaW50IHNpemUsIGludCB2YWx1ZSkgewogICAgaW50IGNvbXBhcmlzb25zID0gMDsKICAgIGludCBsb3cgPSAwOwogICAgaW50IGhpZ2ggPSBzaXplIC0gMTsKICAgIHdoaWxlIChsb3cgPD0gaGlnaCkgewogICAgICAgIGludCBtaWQgPSAobG93ICsgaGlnaCkgLyAyOwogICAgICAgIGNvbXBhcmlzb25zKys7CiAgICAgICAgaWYgKGFyclttaWRdID09IHZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiBjb21wYXJpc29uczsKICAgICAgICB9IGVsc2UgaWYgKGFyclttaWRdIDwgdmFsdWUpIHsKICAgICAgICAgICAgbG93ID0gbWlkICsgMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBoaWdoID0gbWlkIC0gMTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gY29tcGFyaXNvbnM7Cn0KCi8vIEZ1bmN0aW9uIGZvciBzZWxlY3Rpb24gc29ydAp2b2lkIHNlbGVjdGlvblNvcnQoaW50IGFycltdLCBpbnQgc2l6ZSkgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplIC0gMTsgaSsrKSB7CiAgICAgICAgaW50IG1pbkluZGV4ID0gaTsKICAgICAgICBmb3IgKGludCBqID0gaSArIDE7IGogPCBzaXplOyBqKyspIHsKICAgICAgICAgICAgaWYgKGFycltqXSA8IGFyclttaW5JbmRleF0pIHsKICAgICAgICAgICAgICAgIG1pbkluZGV4ID0gajsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAobWluSW5kZXggIT0gaSkgewogICAgICAgICAgICBpbnQgdGVtcCA9IGFycltpXTsKICAgICAgICAgICAgYXJyW2ldID0gYXJyW21pbkluZGV4XTsKICAgICAgICAgICAgYXJyW21pbkluZGV4XSA9IHRlbXA7CiAgICAgICAgfQogICAgfQp9CgppbnQgbWFpbiAoKSB7CgkKCS8vVmFyaWFibGUgRGVjbGFyYXRpb25zCgljb25zdCBpbnQgQVJSQVlfU0laRSA9IDIwOyAgICAgICAgICAgICAgICAgICAgICAgIC8vT1VUUFVUICAgICAtIFNpemUgb2YgdGhlIGFycmF5CglpbnQgbnVtYmVyc1tBUlJBWV9TSVpFXSA9IHs1LCA3LCAyLCA4LCA5LCAxLCAwLCA0LCAzLCA2LCAxMCwgMTIsIDE0LCAxNiwgMTgsIDExLCAxMywgMTUsIDE3LCAxOX07CglpbnQgc2VhcmNoVmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSU5QVVQgICAgICAtIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yIGluIHRoZSBhcnJheQoJaW50IGxpbmVhckNvbXBhcmlzb25zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL09VVFBVVCAgICAgLSBUaGUgbnVtYmVyIG9mIGNvbXBhcmlzb25zIGZvciBsaW5lYXIgc2VhcmNoCglpbnQgYmluYXJ5Q29tcGFyaXNvbnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vT1VUUFVUICAgICAtIFRoZSBudW1iZXIgb2YgY29tcGFyaXNvbnMgZm9yIGJpbmFyeSBzZWFyY2gKCgkvL1Byb21wdCBmb3IgSW5wdXQKCWNvdXQgPDwgIkVudGVyIHRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yOiAiOwoJY2luID4+IHNlYXJjaFZhbHVlOwoJY291dCA8PCBzZWFyY2hWYWx1ZSA8PCBlbmRsOwoJCgkvL1BlcmZvcm0gTGluZWFyIFNlYXJjaAoJbGluZWFyQ29tcGFyaXNvbnMgPSBsaW5lYXJTZWFyY2gobnVtYmVycywgQVJSQVlfU0laRSwgc2VhcmNoVmFsdWUpOwoJCgkvL1NvcnQgdGhlIEFycmF5IGZvciBCaW5hcnkgU2VhcmNoCglzZWxlY3Rpb25Tb3J0KG51bWJlcnMsIEFSUkFZX1NJWkUpOwoJCgkvL1BlcmZvcm0gQmluYXJ5IFNlYXJjaAoJYmluYXJ5Q29tcGFyaXNvbnMgPSBiaW5hcnlTZWFyY2gobnVtYmVycywgQVJSQVlfU0laRSwgc2VhcmNoVmFsdWUpOwoJCgkvL1NlcGFyYXRvciBhbmQgT3V0cHV0IFNlY3Rpb24KCWNvdXQgPDwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iIDw8IGVuZGw7Cgljb3V0IDw8ICJPVVRQVVQ6IiA8PCBlbmRsOwoJCgkvL091dHB1dCBSZXN1bHQKCWNvdXQgPDwgbGVmdCA8PCBzZXR3KDI1KSA8PCAiTGluZWFyIENvbXBhcmlzb25zOiIgPDwgcmlnaHQgPDwgc2V0dygxNSkgPDwgbGluZWFyQ29tcGFyaXNvbnMgPDwgZW5kbDsKCWNvdXQgPDwgbGVmdCA8PCBzZXR3KDI1KSA8PCAiQmluYXJ5IENvbXBhcmlzb25zOiIgPDwgcmlnaHQgPDwgc2V0dygxNSkgPDwgYmluYXJ5Q29tcGFyaXNvbnMgPDwgZW5kbDsKCQp9IC8vZW5kIG9mIG1haW4oKQ==