/******************************************************************************************** ShowSort.cpp Jim Millard for CO311 Visualize Sorting ********************************************************************************************/ #include <iostream> #include <string> #include <time.h> #include <ezwin.h> #include <rect.h> #include "ezwsort.h" using namespace std; sortchoice PromptAndGet(); bool YesNo(string); void FillWithRand(int A[], const int size); void ParseAndPrint(int A[], const int size); int ApiMain() { int Array[MaxElements]; cout << "This program will graphically display the performance of a variety of" << endl << "sorting algorithms." << endl << endl; do { sortchoice whichSort = PromptAndGet(); if (whichSort == done) { Terminate(); return 0; } int toSort = 100; cout << "How many numbers to sort (up to " << MaxElements << "): "; cin >> toSort; if (toSort < 2) return 0; short delayMS; cout << "How long should each move take (in milliseconds): "; cin >> delayMS; if (delayMS < 0) delayMS = 0; FillWithRand(Array, toSort); //setup the array with X numbers if (YesNo("Do you want to see the unsorted list")) { cout << "Unsorted:" << endl; ParseAndPrint(Array, toSort); //show the unsorted array Pause(); } Visualize(Array, toSort, whichSort, delayMS); if (YesNo("Do you want to see the sorted list")) { cout << "Sorted:" << endl; ParseAndPrint(Array, toSort); //show the (hopefully) sorted array Pause(); } } while (YesNo("Visualize Another")); Terminate(); return 0; } bool YesNo(string prompt) { char input; do { cout << prompt << " (Y/N)? "; cin >> input; switch (input) { case 'Y': case 'y': return true; case 'N': case 'n': return false; } } while (1); } sortchoice PromptAndGet() { int menuitem = -1; while ((menuitem < (int)done) || (menuitem > (int)quick)) { cout << "Which sort would you like to visualize: " << endl << '\t' << terrible << ". Super-simple" << endl << '\t' << bubble << ". Bubble Sort" << endl << '\t' << bidibubble << ". Bi-directional Bubble Sort" << endl << '\t' << shell << ". Shell Sort (Modified Bubble)" << endl << '\t' << selection << ". Selection Sort" << endl << '\t' << insertion << ". Insertion Sort" << endl << '\t' << quick << ". QuickSort" << endl << endl << '\t' << done << ". Exit the program" << endl << endl << "Choice: "; cin >> menuitem; } return (sortchoice)menuitem; } void FillWithRand(int A[], const int size) { time_t t; srand((unsigned) time(&t)); for (int i = 0; i < size; i++) { //generate the new number int newNumber = rand() % 10000; //check for duplicates (we don't want any) bool found = false; for (int j = 0; j < size; j++) if (A[j] == newNumber) { found = true; break; } //if there were no duplicates, save the number, otherwise redo the position if (!found) A[i] = newNumber; else i--; } return; } void ParseAndPrint(int A[], const int size) { for (int i = 0; i < size; i++) { if (A[i] < 1000) cout.width(4); cout << A[i] << ' '; } cout << endl << endl; return; }