// LAB 11 QUICK SORT
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// Function to merge two subarrays into a single sorted array
void merge( int arr[ ] , int left, int mid, int right) {
int n1 = mid - left + 1 ;
int n2 = right - mid;
// Create temporary arrays
int L[ n1] , R[ n2] ;
// Copy data to temporary arrays L[] and R[]
for ( int i = 0 ; i < n1; i++ )
L[ i] = arr[ left + i] ;
for ( int j = 0 ; j < n2; j++ )
R[ j] = arr[ mid + 1 + j] ;
// Merge the temporary arrays back into arr[left..right]
int i = 0 , j = 0 , k = left;
while ( i < n1 && j < n2) {
if ( L[ i] <= R[ j] ) {
arr[ k] = L[ i] ;
i++;
} else {
arr[ k] = R[ j] ;
j++;
}
k++;
}
// Copy the remaining elements of L[], if any
while ( i < n1) {
arr[ k] = L[ i] ;
i++;
k++;
}
// Copy the remaining elements of R[], if any
while ( j < n2) {
arr[ k] = R[ j] ;
j++;
k++;
}
}
// Function to perform Merge Sort
void mergeSort( int arr[ ] , int left, int right) {
if ( left < right) {
// Find the middle point
int mid = left + ( right - left) / 2 ;
// Recursively sort the first and second halves
mergeSort( arr, left, mid) ;
mergeSort( arr, mid + 1 , right) ;
// Merge the sorted halves
merge( arr, left, mid, right) ;
}
}
// Function to generate a random array of integers
void generateRandomArray( int arr[ ] , int n) {
for ( int i = 0 ; i < n; i++ ) {
arr
[ i
] = rand ( ) % 10000 ; // random integers between 0 and 9999 }
}
// Function to plot the graph using gnuplot
void plotGraph( int n_values[ ] , double time_taken[ ] , int num_tests) {
// Open a pipe to gnuplot
FILE * gnuplot = popen( "gnuplot -persistent" , "w" ) ;
if ( gnuplot == NULL) {
fprintf ( stderr
, "Error opening gnuplot\n " ) ; return ;
}
// Send commands to gnuplot
fprintf ( gnuplot
, "set title 'Time Complexity of Merge Sort'\n " ) ; fprintf ( gnuplot
, "set xlabel 'Number of Elements (n)'\n " ) ; fprintf ( gnuplot
, "set ylabel 'Time Taken (seconds)'\n " ) ; fprintf ( gnuplot
, "plot '-' with linespoints title 'Time vs n'\n " ) ;
// Send the data points to gnuplot
for ( int i = 0 ; i < num_tests; i++ ) {
fprintf ( gnuplot
, "%d %lf\n " , n_values
[ i
] , time_taken
[ i
] ) ; }
// End the plot
}
int main( ) {
// Seed the random number generator
// Set the values for n (can be modified or read from a file)
int n_values[ ] = { 5000 , 10000 , 15000 , 20000 , 25000 } ; // example values of n
int num_tests = sizeof ( n_values) / sizeof ( n_values[ 0 ] ) ;
double time_taken[ num_tests] ; // Array to store time taken for each n
// Loop over different values of n
for ( int test = 0 ; test < num_tests; test++ ) {
int n = n_values[ test] ;
// Generate an array of random integers of size n
int * arr
= ( int * ) malloc ( n
* sizeof ( int ) ) ; if ( arr == NULL) {
printf ( "Memory allocation failed!\n " ) ; return 1 ;
}
generateRandomArray( arr, n) ;
// Record the start time
clock_t start_time
= clock ( ) ;
// Call the mergeSort function
mergeSort( arr, 0 , n - 1 ) ;
// Record the end time
clock_t end_time
= clock ( ) ;
// Calculate the time taken (in seconds)
time_taken[ test] = ( ( double ) ( end_time - start_time) ) / CLOCKS_PER_SEC;
// Output the results
printf ( "Time taken to sort an array of size %d: %f seconds\n " , n
, time_taken
[ test
] ) ;
// Free the dynamically allocated memory
}
// Plot the graph using gnuplot
plotGraph( n_values, time_taken, num_tests) ;
return 0 ;
}
Ly8gTEFCIDExIFFVSUNLIFNPUlQKCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDx0aW1lLmg+CgovLyBGdW5jdGlvbiB0byBtZXJnZSB0d28gc3ViYXJyYXlzIGludG8gYSBzaW5nbGUgc29ydGVkIGFycmF5CnZvaWQgbWVyZ2UoaW50IGFycltdLCBpbnQgbGVmdCwgaW50IG1pZCwgaW50IHJpZ2h0KSB7CiAgICBpbnQgbjEgPSBtaWQgLSBsZWZ0ICsgMTsKICAgIGludCBuMiA9IHJpZ2h0IC0gbWlkOwoKICAgIC8vIENyZWF0ZSB0ZW1wb3JhcnkgYXJyYXlzCiAgICBpbnQgTFtuMV0sIFJbbjJdOwoKICAgIC8vIENvcHkgZGF0YSB0byB0ZW1wb3JhcnkgYXJyYXlzIExbXSBhbmQgUltdCiAgICBmb3IgKGludCBpID0gMDsgaSA8IG4xOyBpKyspCiAgICAgICAgTFtpXSA9IGFycltsZWZ0ICsgaV07CiAgICBmb3IgKGludCBqID0gMDsgaiA8IG4yOyBqKyspCiAgICAgICAgUltqXSA9IGFyclttaWQgKyAxICsgal07CgogICAgLy8gTWVyZ2UgdGhlIHRlbXBvcmFyeSBhcnJheXMgYmFjayBpbnRvIGFycltsZWZ0Li5yaWdodF0KICAgIGludCBpID0gMCwgaiA9IDAsIGsgPSBsZWZ0OwogICAgd2hpbGUgKGkgPCBuMSAmJiBqIDwgbjIpIHsKICAgICAgICBpZiAoTFtpXSA8PSBSW2pdKSB7CiAgICAgICAgICAgIGFycltrXSA9IExbaV07CiAgICAgICAgICAgIGkrKzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBhcnJba10gPSBSW2pdOwogICAgICAgICAgICBqKys7CiAgICAgICAgfQogICAgICAgIGsrKzsKICAgIH0KCiAgICAvLyBDb3B5IHRoZSByZW1haW5pbmcgZWxlbWVudHMgb2YgTFtdLCBpZiBhbnkKICAgIHdoaWxlIChpIDwgbjEpIHsKICAgICAgICBhcnJba10gPSBMW2ldOwogICAgICAgIGkrKzsKICAgICAgICBrKys7CiAgICB9CgogICAgLy8gQ29weSB0aGUgcmVtYWluaW5nIGVsZW1lbnRzIG9mIFJbXSwgaWYgYW55CiAgICB3aGlsZSAoaiA8IG4yKSB7CiAgICAgICAgYXJyW2tdID0gUltqXTsKICAgICAgICBqKys7CiAgICAgICAgaysrOwogICAgfQp9CgovLyBGdW5jdGlvbiB0byBwZXJmb3JtIE1lcmdlIFNvcnQKdm9pZCBtZXJnZVNvcnQoaW50IGFycltdLCBpbnQgbGVmdCwgaW50IHJpZ2h0KSB7CiAgICBpZiAobGVmdCA8IHJpZ2h0KSB7CiAgICAgICAgLy8gRmluZCB0aGUgbWlkZGxlIHBvaW50CiAgICAgICAgaW50IG1pZCA9IGxlZnQgKyAocmlnaHQgLSBsZWZ0KSAvIDI7CgogICAgICAgIC8vIFJlY3Vyc2l2ZWx5IHNvcnQgdGhlIGZpcnN0IGFuZCBzZWNvbmQgaGFsdmVzCiAgICAgICAgbWVyZ2VTb3J0KGFyciwgbGVmdCwgbWlkKTsKICAgICAgICBtZXJnZVNvcnQoYXJyLCBtaWQgKyAxLCByaWdodCk7CgogICAgICAgIC8vIE1lcmdlIHRoZSBzb3J0ZWQgaGFsdmVzCiAgICAgICAgbWVyZ2UoYXJyLCBsZWZ0LCBtaWQsIHJpZ2h0KTsKICAgIH0KfQoKLy8gRnVuY3Rpb24gdG8gZ2VuZXJhdGUgYSByYW5kb20gYXJyYXkgb2YgaW50ZWdlcnMKdm9pZCBnZW5lcmF0ZVJhbmRvbUFycmF5KGludCBhcnJbXSwgaW50IG4pIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgYXJyW2ldID0gcmFuZCgpICUgMTAwMDA7ICAvLyByYW5kb20gaW50ZWdlcnMgYmV0d2VlbiAwIGFuZCA5OTk5CiAgICB9Cn0KCi8vIEZ1bmN0aW9uIHRvIHBsb3QgdGhlIGdyYXBoIHVzaW5nIGdudXBsb3QKdm9pZCBwbG90R3JhcGgoaW50IG5fdmFsdWVzW10sIGRvdWJsZSB0aW1lX3Rha2VuW10sIGludCBudW1fdGVzdHMpIHsKICAgIC8vIE9wZW4gYSBwaXBlIHRvIGdudXBsb3QKICAgIEZJTEUgKmdudXBsb3QgPSBwb3BlbigiZ251cGxvdCAtcGVyc2lzdGVudCIsICJ3Iik7CiAgICBpZiAoZ251cGxvdCA9PSBOVUxMKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBvcGVuaW5nIGdudXBsb3RcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyBTZW5kIGNvbW1hbmRzIHRvIGdudXBsb3QKICAgIGZwcmludGYoZ251cGxvdCwgInNldCB0aXRsZSAnVGltZSBDb21wbGV4aXR5IG9mIE1lcmdlIFNvcnQnXG4iKTsKICAgIGZwcmludGYoZ251cGxvdCwgInNldCB4bGFiZWwgJ051bWJlciBvZiBFbGVtZW50cyAobiknXG4iKTsKICAgIGZwcmludGYoZ251cGxvdCwgInNldCB5bGFiZWwgJ1RpbWUgVGFrZW4gKHNlY29uZHMpJ1xuIik7CiAgICBmcHJpbnRmKGdudXBsb3QsICJwbG90ICctJyB3aXRoIGxpbmVzcG9pbnRzIHRpdGxlICdUaW1lIHZzIG4nXG4iKTsKCiAgICAvLyBTZW5kIHRoZSBkYXRhIHBvaW50cyB0byBnbnVwbG90CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bV90ZXN0czsgaSsrKSB7CiAgICAgICAgZnByaW50ZihnbnVwbG90LCAiJWQgJWxmXG4iLCBuX3ZhbHVlc1tpXSwgdGltZV90YWtlbltpXSk7CiAgICB9CgogICAgLy8gRW5kIHRoZSBwbG90CiAgICBmcHJpbnRmKGdudXBsb3QsICJlXG4iKTsKICAgIGZjbG9zZShnbnVwbG90KTsKfQoKaW50IG1haW4oKSB7CiAgICAvLyBTZWVkIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgogICAgc3JhbmQodGltZShOVUxMKSk7CgogICAgLy8gU2V0IHRoZSB2YWx1ZXMgZm9yIG4gKGNhbiBiZSBtb2RpZmllZCBvciByZWFkIGZyb20gYSBmaWxlKQogICAgaW50IG5fdmFsdWVzW10gPSB7NTAwMCwgMTAwMDAsIDE1MDAwLCAyMDAwMCwgMjUwMDB9OyAgLy8gZXhhbXBsZSB2YWx1ZXMgb2YgbgogICAgaW50IG51bV90ZXN0cyA9IHNpemVvZihuX3ZhbHVlcykgLyBzaXplb2Yobl92YWx1ZXNbMF0pOwogICAgZG91YmxlIHRpbWVfdGFrZW5bbnVtX3Rlc3RzXTsgIC8vIEFycmF5IHRvIHN0b3JlIHRpbWUgdGFrZW4gZm9yIGVhY2ggbgoKICAgIC8vIExvb3Agb3ZlciBkaWZmZXJlbnQgdmFsdWVzIG9mIG4KICAgIGZvciAoaW50IHRlc3QgPSAwOyB0ZXN0IDwgbnVtX3Rlc3RzOyB0ZXN0KyspIHsKICAgICAgICBpbnQgbiA9IG5fdmFsdWVzW3Rlc3RdOwogICAgICAgIAogICAgICAgIC8vIEdlbmVyYXRlIGFuIGFycmF5IG9mIHJhbmRvbSBpbnRlZ2VycyBvZiBzaXplIG4KICAgICAgICBpbnQgKmFyciA9IChpbnQgKiltYWxsb2MobiAqIHNpemVvZihpbnQpKTsKICAgICAgICBpZiAoYXJyID09IE5VTEwpIHsKICAgICAgICAgICAgcHJpbnRmKCJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQhXG4iKTsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogICAgICAgIGdlbmVyYXRlUmFuZG9tQXJyYXkoYXJyLCBuKTsKICAgICAgICAKICAgICAgICAvLyBSZWNvcmQgdGhlIHN0YXJ0IHRpbWUKICAgICAgICBjbG9ja190IHN0YXJ0X3RpbWUgPSBjbG9jaygpOwogICAgICAgIAogICAgICAgIC8vIENhbGwgdGhlIG1lcmdlU29ydCBmdW5jdGlvbgogICAgICAgIG1lcmdlU29ydChhcnIsIDAsIG4gLSAxKTsKICAgICAgICAKICAgICAgICAvLyBSZWNvcmQgdGhlIGVuZCB0aW1lCiAgICAgICAgY2xvY2tfdCBlbmRfdGltZSA9IGNsb2NrKCk7CiAgICAgICAgCiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSB0aW1lIHRha2VuIChpbiBzZWNvbmRzKQogICAgICAgIHRpbWVfdGFrZW5bdGVzdF0gPSAoKGRvdWJsZSkoZW5kX3RpbWUgLSBzdGFydF90aW1lKSkgLyBDTE9DS1NfUEVSX1NFQzsKICAgICAgICAKICAgICAgICAvLyBPdXRwdXQgdGhlIHJlc3VsdHMKICAgICAgICBwcmludGYoIlRpbWUgdGFrZW4gdG8gc29ydCBhbiBhcnJheSBvZiBzaXplICVkOiAlZiBzZWNvbmRzXG4iLCBuLCB0aW1lX3Rha2VuW3Rlc3RdKTsKICAgICAgICAKICAgICAgICAvLyBGcmVlIHRoZSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgbWVtb3J5CiAgICAgICAgZnJlZShhcnIpOwogICAgfQoKICAgIC8vIFBsb3QgdGhlIGdyYXBoIHVzaW5nIGdudXBsb3QKICAgIHBsb3RHcmFwaChuX3ZhbHVlcywgdGltZV90YWtlbiwgbnVtX3Rlc3RzKTsKICAgIAogICAgcmV0dXJuIDA7Cn0K