Greeting again. I have a homework assigment that I worked on a long time ago and now I need to add something. I need to add in a cycle counter... More or less a counter that counts the number of cycles this radix sort takes. Can anyone give me a habd I really don't know where to add the counters. Thanks
Code:#include "stdafx.h" // Based off orginal LabShell.cpp // Which defined the entry point for the console application. #define _TCHAR char #include <fstream> #include <iostream> #include <ctime> #include <vector> //#include <cassert> using namespace std; void genData(int *, int); int radixSort(int *, int); long count = 0; void genData(long *dta, int n) {// generates social security numbers that do not contain zeroes #define limit 1000000 // make this number whatever you want - we are just looking at a sample of the data to make sure it is correct ofstream f;// open a file to write a sample of the output //srand(time(0)); if(n < limit) { f.open("data.txt", ios::out); if(!f.is_open()) { cout << "SSN sample file did not open" << endl; system("pause"); exit(0); } } for(int i=0; i < n; i++)// generate the social security numbers at random { dta[i] = rand()%889 + 111 + 1000*(rand()%889 + 111) + 1000000*(rand()%889 + 111); if(dta[i] > 999999999) dta[i] = dta[i] % 1000000000; if(n < limit)f << i<< " " << dta[i] << endl;// write them out if in the sample you selected } if(f.is_open())f.close();// if the file is open, close it } void sort(long*, long*, long); long* radixSort(long *dta, int n) { long* dest = new long[n]; sort(dta, dest, n); return dest; // this is a dummy routine - you need to write your own that sorts the data and counts the operations } void print_data(const char* title, long* data, int count) { cout << "--------" << title << "--------" << endl; for(int i=0; i<count; ++i) { cout << data[i] << endl; } } // main program to run the radix sort graphing int _tmain(int argc, _TCHAR* argv[]) { long *data;// pointer to where SSNs will be stored int N=2;// initial size of the SSN data set. ofstream f; f.open("output.csv", ios::out);// open the output excel file if(f.is_open())// if it opened, proceed, else issue error and quit { for(int i = 0; i < 15; i++) {// generate 15 sets of data the first of size 2, the next of size 4, until you get to 32768 (2 ^ 15) data = new long [N];// allocate memory to hold the data generated by genData if(data != NULL) // did we get the memory we requested? { genData(data, N);// generate the SSNs and out them in the array print_data("unsorted", data, N); long* dest = radixSort(data, N); // sort the data and count the operations print_data("sorted", dest, N); cout << "------\n"; f << N << "," << N << endl;// write the data pairs to the excel file for later graphing cout << N << "," << N << endl;// write the data pairs to the screen also N = 2 * N;// double the data size for the next pass delete [] data;// free the data array because it will be reallocated next time } else {// did not get the memory we asked for, issue error message and exit cout << "Out of memory" << endl; system("pause");// wait for user to see the message break; } } f.close();// close the file } else {// file did not open, so alert user and exit cout << "csv output file did not open" << endl; system("pause"); } system("pause"); return 0; } // the first parameter is the radix which is used to collect the numbers // the second one is the number of data elements // in is the array of data // out is the result void radix(int byte, long N, long *in, long* out) { //create buckets vector<long> bucket[1000]; /*for(int x =0; x < 999; x++) { bucket[x][0] = 0; for(int y = 0; y < 100; y++) { bucket[x][y]=0; } //memset (bucket, 0, sizeof (bucket[x])); } */ //loop through the whole input set for (int i = 0; i < N; i++) { if(in[i] < 0) { in[i] = in[i] * -1; } long temp = 0; switch(byte) { case 0: temp = in[i] % 1000; break; case 1: temp = in[i] / 1000; temp = temp % 1000; break; case 2: temp = in[i] / 1000000; } //temp is now the index number for the bucket //we need to find an empty place in the bucket //int t = 0; //while(bucket[temp]. != 0) /*{ t++; //cout << "temp= " << temp << "in= "<< in[i] << "I= " << i << "Bucket = " << bucket[temp][t] << endl; }*/ //place number in bucket bucket[temp].push_back(in[i]); } //get numbers from buckets, put in array //currentI is the position on the out array int currentI = 0; for(i = 0; i< 1000; i++) { //t is the position in the bucket int t = 0; if(bucket[i].size() > 0) { for(int x = 0; bucket[i].size() > x ; x++) { out[currentI] = bucket[i].at(x); currentI++; //assert(currentI > (N + 1)); //cout << currentI; } } } if(currentI != N) cout << " N = " << N << " CurrentI = " << currentI << endl; } void sort(long *in, long *out, long count) { long *tmp = out; out = new long [count]; // collect radices for each byte radix(0, count, in, out); in = out; // create a new output list out = new long [count]; //pass 2 radix(1, count, in, out); in = out; // use output list from calling function out = tmp; //pass 3 radix(2, count, in, out); } /*int main() { return _tmain(0, NULL); } */



LinkBack URL
About LinkBacks


