Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

I need to write a program that uses insertion, merge, quick and counting sort fo

ID: 3723631 • Letter: I

Question

I need to write a program that uses insertion, merge, quick and counting sort for the parts below in C++. I have attached a screenshot of the input files below and would like the program to have comments throughout it to explain each function.

a)     The program implements insertion sort, merge sort, quick sort, and counting sort as subprograms or classes (radix sort is optional);

b)     The program reads input from a data file specified by user and write the sorted output into another file;

c)     Design your program in the way that it can accept user’s options such as:

*. Which sort algorithm to use;

*. Which sort order to use, that is, non-decreasing order or non-increasing order?

*. Whether should the output remove duplications?

f)      Results and analysis: use your program to measure the running time on the set of input data files with different sort algorithms to sort in non-decreasing order without the removal duplication option. Normally you need to run each test for 10 times and report the average. Summarize the results in a table and/or a graph.

file10 txt (file10.txt), file 100 txt (file100.txt), file 1000 txt (file1000.txt), file 10000 txt (file10000.txt), file100000 txt (file100000.txt), f file1000000.bxt (ile 1000000.txt)

Explanation / Answer

#include<stdlib.h>

#include<stdio.h>

// Merges two subarrays of arr[].

// First subarray is arr[l..m]

// Second subarray is arr[m+1..r]

void merge(int arr[], int l, int m, int r)

{

int i, j, k;

int n1 = m - l + 1;

int n2 = r - m;

/* create temp arrays */

int L[n1], R[n2];

/* Copy data to temp arrays L[] and R[] */

for (i = 0; i < n1; i++)

L[i] = arr[l + i];

for (j = 0; j < n2; j++)

R[j] = arr[m + 1+ j];

/* Merge the temp arrays back into arr[l..r]*/

i = 0; // Initial index of first subarray

j = 0; // Initial index of second subarray

k = l; // Initial index of merged subarray

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 there

are any */

while (i < n1)

{

arr[k] = L[i];

i++;

k++;

}

/* Copy the remaining elements of R[], if there

are any */

while (j < n2)

{

arr[k] = R[j];

j++;

k++;

}

}

/* l is for left index and r is right index of the

sub-array of arr to be sorted */

void mergeSort(int arr[], int l, int r)

{

if (l < r)

{

// Same as (l+r)/2, but avoids overflow for

// large l and h

int m = l+(r-l)/2;

// Sort first and second halves

mergeSort(arr, l, m);

mergeSort(arr, m+1, r);

merge(arr, l, m, r);

}

}

/* UTILITY FUNCTIONS */

/* Function to print an array */

void printArray(int A[], int size)

{

int i;

for (i=0; i < size; i++)

printf("%d ", A[i]);

printf(" ");

}

void countSort(char arr[])

{

// The output character array that will have sorted arr

char output[strlen(arr)];

// Create a count array to store count of inidividul

// characters and initialize count array as 0

int count[RANGE + 1], i;

memset(count, 0, sizeof(count));

// Store count of each character

for(i = 0; arr[i]; ++i)

++count[arr[i]];

// Change count[i] so that count[i] now contains actual

// position of this character in output array

for (i = 1; i <= RANGE; ++i)

count[i] += count[i-1];

// Build the output character array

for (i = 0; arr[i]; ++i)

{

output[count[arr[i]]-1] = arr[i];

--count[arr[i]];

}

// Copy the output array to arr, so that arr now

// contains sorted characters

for (i = 0; arr[i]; ++i)

arr[i] = output[i];

}

void insertionSort(int arr[], int n)

{

int i, key, j;

for (i = 1; i < n; i++)

{

key = arr[i];

j = i-1;

/* Move elements of arr[0..i-1], that are

greater than key, to one position ahead

of their current position */

while (j >= 0 && arr[j] > key)

{

arr[j+1] = arr[j];

j = j-1;

}

arr[j+1] = key;

}

}

// A utility function to print an array of size n

void printArray(int arr[], int n)

{

int i;

for (i=0; i < n; i++)

printf("%d ", arr[i]);

printf(" ");

}

void swap(int* a, int* b)

{

int t = *a;

*a = *b;

*b = t;

}

/* This function takes last element as pivot, places

the pivot element at its correct position in sorted

array, and places all smaller (smaller than pivot)

to left of pivot and all greater elements to right

of pivot */

int partition (int arr[], int low, int high)

{

int pivot = arr[high]; // pivot

int i = (low - 1); // Index of smaller element

for (int j = low; j <= high- 1; j++)

{

// If current element is smaller than or

// equal to pivot

if (arr[j] <= pivot)

{

i++; // increment index of smaller element

swap(&arr[i], &arr[j]);

}

}

swap(&arr[i + 1], &arr[high]);

return (i + 1);

}

/* The main function that implements QuickSort

arr[] --> Array to be sorted,

low --> Starting index,

high --> Ending index */

void quickSort(int arr[], int low, int high)

{

if (low < high)

{

/* pi is partitioning index, arr[p] is now

at right place */

int pi = partition(arr, low, high);

// Separately sort elements before

// partition and after partition

quickSort(arr, low, pi - 1);

quickSort(arr, pi + 1, high);

}

}

/* Driver program to test above functions */

int main()

{

int arr[] = {12, 11, 13, 5, 6, 7};

int arr_size = sizeof(arr)/sizeof(arr[0]);

int i;

int j=0;

printf("Given array is ");

printArray(arr, arr_size);

while (j!=1)

{

printf("Enter the sorting to implement: 1. Insertion 2. Merge 3. Quick 4. Counting");

scanf("%d",&i);

switch(i)

{

case 1: insertionSort(arr, n); break;

case 2: mergeSort(arr, 0, arr_size - 1);

case 3: quickSort(arr, 0, n-1);

case 4: countSort(arr);

}

printf("enter 1 to exit ");

scanf("%d",j);

}

printf(" Sorted array is ");

printArray(arr, arr_size);

return 0;

}