Started implementing Merge/Quicksort.
This commit is contained in:
parent
d0a47f7b64
commit
8d916ed661
87
src/Assignments/A4/Mergesort.java
Normal file
87
src/Assignments/A4/Mergesort.java
Normal file
@ -0,0 +1,87 @@
|
||||
package Assignments.A4;
|
||||
|
||||
public class Mergesort {
|
||||
|
||||
// Merges two subarrays of arr[].
|
||||
// First subarray is arr[l..m]
|
||||
// Second subarray is arr[m+1..r]
|
||||
void merge(int[] list, int left, int mid, int right) {
|
||||
|
||||
// Create temp arrays
|
||||
int[] sub1 = new int[mid - left + 1];
|
||||
int[] sub2 = new int[right - mid];
|
||||
|
||||
// Copy data to temp arrays
|
||||
System.arraycopy(list, left, sub1, 0, sub1.length);
|
||||
System.arraycopy(list, mid + 1, sub2, 0, sub2.length);
|
||||
|
||||
int l1 = 0;
|
||||
int l2 = 0;
|
||||
|
||||
// Initial index of merged subarray array
|
||||
int k = left;
|
||||
while (l1 < sub1.length && l2 < sub2.length) {
|
||||
if (sub1[l1] <= sub2[l2]) {
|
||||
list[k] = sub1[l1];
|
||||
l1++;
|
||||
} else {
|
||||
list[k] = sub2[l2];
|
||||
l2++;
|
||||
}
|
||||
k++;
|
||||
}
|
||||
|
||||
// Copy remaining elements of L[] if any
|
||||
while (l1 < sub1.length) {
|
||||
list[k] = sub1[l1];
|
||||
l1++;
|
||||
k++;
|
||||
}
|
||||
|
||||
// Copy remaining elements of R[] if any
|
||||
while (l2 < sub2.length) {
|
||||
list[k] = sub2[l2];
|
||||
l2++;
|
||||
k++;
|
||||
}
|
||||
}
|
||||
|
||||
// Main function that sorts arr[l..r] using
|
||||
// merge()
|
||||
void sort(int[] list, int left, int right) {
|
||||
if (left < right) {
|
||||
|
||||
// Find the middle point
|
||||
int m = left + (right - left) / 2;
|
||||
|
||||
// Sort first and second halves
|
||||
sort(list, left, m);
|
||||
sort(list, m + 1, right);
|
||||
|
||||
// Merge the sorted halves
|
||||
merge(list, left, m, right);
|
||||
}
|
||||
}
|
||||
|
||||
// A utility function to print array of size n
|
||||
static void printArray(int[] list) {
|
||||
int n = list.length;
|
||||
for (int i = 0; i < n; ++i)
|
||||
System.out.print(list[i] + " ");
|
||||
System.out.println();
|
||||
}
|
||||
|
||||
// Driver code
|
||||
public static void main(String[] args) {
|
||||
int[] arr = {12, 11, 13, 5, 6, 7};
|
||||
|
||||
System.out.println("Given array is");
|
||||
printArray(arr);
|
||||
|
||||
Mergesort ob = new Mergesort();
|
||||
ob.sort(arr, 0, arr.length - 1);
|
||||
|
||||
System.out.println("\nSorted array is");
|
||||
printArray(arr);
|
||||
}
|
||||
}
|
71
src/Assignments/A4/Quicksort.java
Normal file
71
src/Assignments/A4/Quicksort.java
Normal file
@ -0,0 +1,71 @@
|
||||
package Assignments.A4;
|
||||
|
||||
public class Quicksort {
|
||||
|
||||
/** Number of comparisons for the sorting alg. */
|
||||
public int comps = 0;
|
||||
|
||||
/**
|
||||
* Sorts the provided list using quicksort.
|
||||
* @param list the list to be sorted.
|
||||
*/
|
||||
public void sort(int[] list) {
|
||||
if (list != null && list.length > 0) {
|
||||
this.comps = 0;
|
||||
quicksort(list, 0, list.length - 1);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This functions sorts the provided array (by reference) using quicksort algorithm.
|
||||
* <p>
|
||||
* It does this by while high is greater than low, it finds the partitioning index and then
|
||||
* calls quicksort again on the lower half and upper half.
|
||||
* </p>
|
||||
* @param list the list to be sorted.
|
||||
* @param low the lower bound of the list.
|
||||
* @param high the upper bound of the list.
|
||||
*/
|
||||
private void quicksort(int[] list, int low, int high) {
|
||||
if (low < high) {
|
||||
this.comps++;
|
||||
int pi = partition(list, low, high);
|
||||
quicksort(list, low, pi - 1);
|
||||
quicksort(list, pi + 1, high);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This function takes the last element as pivot, places the pivot element at its sorted position.
|
||||
* @param values the array to be sorted.
|
||||
* @param low the lower bound of the array.
|
||||
* @param high the upper bound of the array.
|
||||
* @return the partition index.
|
||||
*/
|
||||
private int partition(int[] values, int low, int high) {
|
||||
int pivot = values[high];
|
||||
int i = (low - 1);
|
||||
|
||||
for (int j = low; j <= high - 1; j++) {
|
||||
if (values[j] < pivot) {
|
||||
i++;
|
||||
swap(values, i, j);
|
||||
}
|
||||
this.comps++;
|
||||
}
|
||||
swap(values, i + 1, high);
|
||||
return (i + 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Abstracts teh swap function to make the code easier to follow.
|
||||
* @param values the array to be sorted.
|
||||
* @param i the first index to be swapped.
|
||||
* @param j the second index to be swapped.
|
||||
*/
|
||||
private void swap(int[] values, int i, int j) {
|
||||
int temp = values[i];
|
||||
values[i] = values[j];
|
||||
values[j] = temp;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user