1.MERGE AND QUICK SORT
Sun Nov 03 2024 12:40:56 GMT+0000 (Coordinated Universal Time)
Task-1 a) Implement Merge sort algorithm and plot its time complexity with reference to the size of the input. Algorithm: Algorithm MergeSort(low, high) // a[low : high] is a global array to be sorted. // Small(P) is true if there is only one element // to sort. In this case the list is already sorted. { if (low < high) then // If there are more than one element { // Divide P into subproblems. // Find where to split the set. mid := ⌊(low + high) / 2⌋; // Solve the subproblems. MergeSort(low, mid); MergeSort(mid + 1, high); // Combine the solutions. Merge(low, mid, high); } } Algorithm Merge(low, mid, high) // a[low : high] is a global array containing two sorted // subsets in a[low : mid] and in a[mid + 1 : high]. The goal // is to merge these two sets into a single set residing // in a[low : high]. b[ ] is an auxiliary global array. { h := low; i := low; j := mid + 1; while ((h ≤ mid) and (j ≤ high)) do { if (a[h] ≤ a[j]) then { b[i] := a[h]; h := h + 1; } else { b[i] := a[j]; j := j + 1; } i := i + 1; } if (h > mid) then for k := j to high do { b[i] := a[k]; i := i + 1; } else for k := h to mid do { b[i] := a[k]; i := i + 1; } for k := low to high do a[k] := b[k]; } Program: #include <stdio.h> #include <time.h> void merge(int a[],int i1,int j1,int i2,int j2) { int i,j,k=0; i=i1; j=i2; int temp[100]; while(i<=j1 && j<=j2) { if(a[i]<a[j]) temp[k++]=a[i++]; else temp[k++]=a[j++]; } while(i<=j1) temp[k++]=a[i++]; while(j<=j2) temp[k++]=a[j++]; for(i=i1,j=0; i<=j2; i++,j++) a[i]=temp[j]; } void partition(int a[],int l,int h) { if(l<h) { int mid=(l+h)/2; partition(a,l,mid); partition(a,mid+1,h); merge(a,l,mid,mid+1,h); } } int main() { int n; printf("enter the size of array: "); scanf("%d",&n); int a[n]; for(int i=0; i<n; i++) a[i] = n - i; clock_t t = clock(); partition(a,0,n-1); t = clock() - t; printf("Time taken: %f \n",((float)t*1000)/CLOCKS_PER_SEC); for(int i=0; i<n; i++) printf("%d ",a[i]); return 0; } Output: enter the size of array: 5 Time taken: 0.002000 1 2 3 4 5 === Code Execution Successful === b) Implement Quick sort algorithm and plot its time complexity regarding asymptotic notations (Best, average, and worst). Algorithm: Algorithm QuickSort(p, q) // Sorts the elements a[p], ..., a[q] which reside in the global // array a[1 : n] into ascending order; a[n + 1] is considered to // be defined and must be ≥ all the elements in a[1 : n]. { if (p < q) then // If there are more than one element { // divide P into two subproblems. j := Partition(a, p, q + 1); // j is the position of the partitioning element. // Solve the subproblems. QuickSort(p, j - 1); QuickSort(j + 1, q); // There is no need for combining solutions. } } Algorithm Partition(a, m, p) // Within a[m], a[m + 1], ..., a[p − 1] the elements are // rearranged in such a manner that if initially t = a[m], // then after completion a[q] = t for some q between m // and p − 1, a[k] ≤ t for m ≤ k < q, and a[k] ≥ t // for q < k < p. q is returned. Set a[p] = ∞. { v := a[m]; i := m; j := p; repeat { repeat i := i + 1; until (a[i] ≥ v); repeat j := j − 1; until (a[j] ≤ v); if (i < j) then Interchange(a, i, j); } until (i ≥ j); a[m] := a[j]; a[j] := v; return j; } Algorithm Interchange(a, i, j) // Exchange a[i] with a[j]. { p := a[i]; a[i] := a[j]; a[j] := p; } Program: #include <stdio.h> #include <time.h> void quicksort(int number[25], int first, int last) { int i, j, pivot, temp; if (first < last) { pivot = first; i = first; j = last; while (i < j) { while (number[i] <= number[pivot] && i < last) i++; while (number[j] > number[pivot]) j--; if (i < j) { temp = number[i]; number[i] = number[j]; number[j] = temp; } } temp = number[pivot]; number[pivot] = number[j]; number[j] = temp; quicksort(number, first, j - 1); quicksort(number, j + 1, last); } } int main() { int i, count, number[25]; printf("SIZE OF ARRAY?: "); scanf("%d", &count); printf("Enter array elements: "); for (i = 0; i < count; i++) { scanf("%d", &number[i]); } clock_t t = clock(); // Start time quicksort(number, 0, count - 1); t = clock() - t; // End time printf("Time taken: %f ms\n", ((float)t * 1000) / CLOCKS_PER_SEC); printf("Sorted elements:"); for (i = 0; i < count; i++) { printf(" %d", number[i]); } printf("\n"); return 0; } Output: SIZE OF ARRAY?: 5 Enter array elements: 5 4 3 2 1 Time taken: 0.002000 ms Sorted elements: 1 2 3 4 5 === Code Execution Successful ===
Comments