// // Implementation of insertion sort algorithm. // // Driver generates and sorts a random sequence of N integers. // N and seed are passed as command-line arguments, with optional // "--verbose" to request verbose output (intermediate results). // // const DATA_LIMIT specifies upper bound for random data. // #include #include #include #include #include const int DATA_LIMIT = 100; void fillWithRandom(int seed, std::vector &v); void printVector(std::vector v); void insertionSort(std::vector &v, bool verbose); /* main (driver) */ int main(int argc, char *argv[]) { if (argc < 3) { std::cerr << "usage: " << argv[0] << " seed N [--verbose]" << std::endl; return EXIT_FAILURE; } char *endptr; long seed = strtol(argv[1], &endptr, 10); if (*endptr != '\0') { std::cerr << "non-numeric seed" << std::endl; return EXIT_FAILURE; } long n = strtol(argv[2], &endptr, 10); if (*endptr != '\0') { std::cerr << "non-numeric N" << std::endl; return EXIT_FAILURE; } bool verbose = (argc > 3) && (strcmp(argv[3], "--verbose") == 0); /* generate input */ std::vectorv(n); fillWithRandom(seed, v); std::cout << "Data before sort:\n"; printVector(v); insertionSort(v, verbose); std::cout << "\nData after sort:\n"; printVector(v); return EXIT_SUCCESS; } /* fill vector with random data */ void fillWithRandom(int seed, std::vector &v) { srand(seed); for (auto& iter : v) { iter = rand() % DATA_LIMIT; } } /* print vector */ void printVector(std::vector v) { for (int val : v) { std::cout << val << " "; } std::cout << std::endl; } /* * insertion sort: * sort vector of n ints */ void insertionSort(std::vector &v, bool verbose) { if (verbose) { std::cout << "initially, sorted data: " << v[0] << " " << std::endl; } for (int i = 1; i < (int) v.size(); ++i) { // Insert v[i] in v[0 .. i-1] int key = v[i]; int j = i - 1; while (j >= 0 && v[j] > key) { v[j+1] = v[j]; j -= 1; } v[j+1] = key; if (verbose) { std::cout << "after step " << i << " key = " << key << ", new key position = " << j+1 << ", sorted data: "; for (int k = 0; k <= i; ++k) { std::cout << v[k] << " "; } std::cout << std::endl; } } }