Inplace Quicksort Implementation
Author |
Message |
Cervantes
|
Posted: Tue Apr 17, 2007 5:16 pm Post subject: Inplace Quicksort Implementation |
|
|
My first attempt at implementing quicksort in Java. I did it completely in place, which is nice.
Java: |
public class Sort {
public static void quick (int[] arr ) {
quickAux (arr, 0, arr. length - 1);
}
private static void quickAux (int[] arr, int start, int end ) {
if (start < end ) {
int pivot = arr [end ];
int i = start;
int j = end;
while (i != j ) {
if (arr [i ] < pivot ) {
i = i + 1;
}
else {
arr [j ] = arr [i ];
arr [i ] = arr [j- 1];
j = j - 1;
}
}
arr [j ] = pivot;
quickAux (arr, start, j- 1);
quickAux (arr, j+ 1, end );
}
}
public static void printArr (int[] arr ) {
for (int i = 0; i < arr. length; i++ ) {
System. out. print(arr [i ] + "|");
}
System. out. println("");
}
public static void main (String[] args ) {
int[] a = {4, 8, 6, 7, 3, 1, 3, 13, 2, 5,- 4};
quick (a );
printArr (a );
}
}
|
While doing this, I questioned why the code in the main method there works, but
Java: |
quick({4,8,6,7,3,1,3,13,2,5,-4});
|
fails. |
|
|
|
|
|
Sponsor Sponsor
|
|
|
bugzpodder
|
Posted: Tue Apr 17, 2007 5:32 pm Post subject: RE:Inplace Quicksort Implementation |
|
|
most quicksorts are in place... try a inplace merge sort |
|
|
|
|
|
Cervantes
|
Posted: Tue Apr 17, 2007 6:33 pm Post subject: RE:Inplace Quicksort Implementation |
|
|
I did. It wasn't loads of fun. |
|
|
|
|
|
wtd
|
Posted: Wed Apr 18, 2007 1:22 pm Post subject: RE:Inplace Quicksort Implementation |
|
|
The second attempt failed because:
code: | {4,8,6,7,3,1,3,13,2,5,-4} |
Is not a Java array literal. It's just an exception in Java's syntax used to make C and C++ programmer's slightly less disgruntled when they have to use Java.
code: | quick(new int[] {4,8,6,7,3,1,3,13,2,5,-4}); |
Oh, and do try to make it generic. Either by sorting any Comparable object, or by using Java 1.5 generics. |
|
|
|
|
|
klopyrev
|
Posted: Wed Apr 18, 2007 3:42 pm Post subject: Re: Inplace Quicksort Implementation |
|
|
I was thinking about it, but I can't think of anyway to implement Mergesort in place? Any hints?
KL |
|
|
|
|
|
Cervantes
|
Posted: Wed Apr 18, 2007 10:25 pm Post subject: RE:Inplace Quicksort Implementation |
|
|
wtd, thanks for enlightening me on that. Of course it makes sense now. I should have known to include the new int[].
I did this simply with integers simply because this was done to study for my CS exam and we didn't have to know about Comparable or generics for the exam. I know it's nothing more than an excuse, but it was rather necessary, given my time constraints. =/
KL, I thought of a way to do it, but it involved doing some shifting.
The trouble is writing a function that takes your array, and 3 (or 4 if you really want to be general) integers representing start, mid, and end, and sorts it, assuming that the data from start to mid is sorted and the data from mid+1 to end is sorted.
Here's an example. I hope you can pick up on the syntax convention I'll use:
[6 8 | 7 9] (compare 6 and 7)
6 [8 | 7 9] (compare 8 and 7)
6 7 [8 | 9] (compare 8 and 9)
6 7 8 [| 9] (throw in the rest of the second array)
6 7 8 9
Another example:
[3 4 | 1 2] (compare 3 and 1)
1 [3 4 | 2] (compare 3 and 2)
1 2 [3 4|] (throw in the rest of the first array)
1 2 3 4
The second example in particular illustrates that some shifting will need to be done. For example, when you move 1 to the front, you have to shift both the 3 and the 4 one over.
That's why I said this wasn't loads of fun. Maybe there's a better way to do it though. |
|
|
|
|
|
klopyrev
|
Posted: Thu Apr 19, 2007 7:44 am Post subject: Re: Inplace Quicksort Implementation |
|
|
I was thinking about that, but that ruins the runtime of mergesort completely. It leaves you with a runtime of O(N^2logN), which is worse than bubblesort.
KL |
|
|
|
|
|
|
|