Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Partition an array with this algorithm

Tags:

java

This is a lab homework assignment that I have struggled with for a week now. There is more to this problem and I am lost. I could use a hint in some direction, not asking for the answer. My apologies if I've posted something incorrectly, my brain is fried. Any help at all would be appreciated.

a. Create two new arrays called lesser and greater. These will be used to store the elements of "a" that are less than or greater than the pivot element, respectively.

b. Loop through all elements of "a" besides the pivot. If the element is less than the pivot, copy it into the lesser array. If the element is greater than or equal to the pivot, copy it into the greater array.

c. Create a new array called result, of the same length as "a".

d. Copy the elements of lesser into result.

e. Copy the pivot element itself into the result.

f. Copy the elements of greater into result.

g. Return the partitioned array result.

Write a method public static double[] partition(double[] a) that implements this algorithm.

public class Lab6 {
public static void main(String[] args) {

}

public static double[] loadRandom(double[] randomNumbersArray)
{
    randomNumbersArray = new double[100000];

    // looping through to assign random values from 1 - 100000
    for (int i = 0; i < randomNumbersArray.length; i++) {
        randomNumbersArray[i] = (int)(Math.random() * 2000000000); 
    }

    return randomNumbersArray;
}

public static double[] partitionInPlace(double[] a)
{
    loadRandom(a);
    double pivotValue = a[0];
    int j = 0;  //j keeps track of which elements have already been placed

    //start by swapping the pivot value with the value at the rightmost index
    a[0] = a[a.length-1];
    a[a.length-1] = pivotValue;

    //go through the array (except for the rightmost index) to find the elements
    //that are < pivotValue
    for (int i = 0; i < a.length-1; i++) {
        //if a[i] is < pivotValue, then swap a[i] and a[j] and incremement j
        if (a[i] < pivotValue) {
            double temp = a[i];
            a[i] = a[j];
            a[j] = temp;

            j++;
        }
    }

    //now move the pivot back from its position on the right
    double temp = a[j];
    a[j] = a[a.length-1];
    a[a.length-1] = temp;

    //return the partitioned array
    return a;
}

public static double[] partition(double[] a) 
{
    double lesser;
    double greater;
    double result;

    return a;
}
}
like image 707
Ponyboy Curtis Avatar asked Jan 21 '26 16:01

Ponyboy Curtis


1 Answers

Say you start with an array a with length l.

Then you should create two arrays lesser and greater with l-1 length (since all values could be smaller or larger than the pivot).

double[] lesser = new double[a.length() - 1];
double[] greater = new double[a.length() - 1];

After that, it is simply (as in your exercise) copying the data to these arrays. Keep track of the length of both arrays like lesserlength = 0; greaterlength = 0; and incrementing that each time you insert a value. That way you know where you can insert the next value in lesser and greater.

Eventually you can copy lesser into a new array of length l.

double[] result = new int[a.length()];

You know that lesserlength + 1 + greaterlength == a.length()

You can use System.arraycopy(source, srcpos, dest, dstpos, len) to copy lesser and greater into the result.

That should be enough to help you out.

like image 183
bas Avatar answered Jan 24 '26 09:01

bas