java - Keeping two arrays, String[] and int[], parallel with merge sort -
i'm having trouble keeping 2 arrays in parallel within merge sorting algorithm. suppose have array defmergesort , intmergesort2.
i lexicographically order string defmergesort,
string[] defmergesort = {"echo", "alpha", "charlie", "beta", "alpha", "echo"};
array intmergesort2 represents element position in parallel defmergesort. (ex: defmergesort[0] = echo contingent intmergesort2[0] = 0, defmergesort[3] = beta contingent intmergesort2[3] = 3) intmergesort2 rearranged in parallel defmergesort, although not numerically sorted,
int[] intmergesort2 = {0,1,2,3,4,5};
the end result should similar (not sure if parallel ordering intmergesort2[] in example correct duplicate strings in defmergesort[]):
- defmergesort[0] alpha = intmergesort2[1] 1
- defmergesort[1] alpha = intmergesort2[4] 4
- defmergesort[2] beta = intmergesort2[3] 3
- defmergesort[3] charlie = intmergesort2[2] 2
- defmergesort[4] echo = intmergesort2[0] 0
- defmergesort[5] echo = intmergesort2[5] 5
the following merge sort algorithm can lexicographically order defmergesort, although cannot figure out how keep defmergesort in parallel stipulated above:
//mergesort code found at: //http://www.buildingjavaprograms.com/code-files/2ed/ch13/mergesort.java public static void mergesort(string[] defmergesort, int[] intmergesort2) { if (defmergesort.length > 1) { // split array 2 halves string[] left = lefthalf(defmergesort); string[] right = righthalf(defmergesort); // recursively sort 2 halves mergesort(left, intmergesort2); mergesort(right, intmergesort2); // merge sorted halves sorted whole merge(defmergesort, intmergesort2, left, right); } } // returns first half of given array. public static string[] lefthalf(string[] defmergesort) { int size1 = defmergesort.length / 2; string[] left = new string[size1]; (int = 0; < size1; i++) { left[i] = defmergesort[i]; } return left; } // returns second half of given array. public static string[] righthalf(string[] defmergesort) { int size1 = defmergesort.length / 2; int size2 = defmergesort.length - size1; string[] right = new string[size2]; (int = 0; < size2; i++) { right[i] = defmergesort[i + size1]; } return right; } // merges given left , right arrays given // result array. second, working version. // pre : result empty; left/right sorted // post: result contains result of merging sorted lists; public static void merge(string[] defmergesort, int[] intmergesort2, string[] left, string[] right){ int i1 = 0; // index left array int i2 = 0; // index right array for(int = 0; < defmergesort.length; i++){ if (i2 >= right.length || (i1 < left.length && left[i1].compareto(right[i2]) <= 0)) { defmergesort[i] = left[i1]; i1++; } else { defmergesort[i] = right[i2]; i2++; } } }
define object containing integer , string values, have single array of object, sort array.
i.e.
class dataelement { final string str; final int i; //add constructor here } dataelement[] array; // sort array
note either need implement comparable
in dataelement or specify comparator
sort method in order control sorting.
Comments
Post a Comment